gpt4 book ai didi

c++ - 如何使用位来表示控制语句?

转载 作者:行者123 更新时间:2023-11-28 06:35:50 24 4
gpt4 key购买 nike

我正在使用 this 中的说明answer 获取和设置 char 的位值。设置和获取没有/不应该有任何问题(语义上与链接的答案相同)。

问题是我无法在控制语句 (if) 中正确使用它的位值。

我遇到问题的相关代码段:

unsigned long int find_container(unsigned long int k){
return (k)/(sizeof(char)*8);
}

unsigned long int find_bit(unsigned long int k){
return (k)%(sizeof(char)*8);
}

....
if (~(marks[find_container((k-3)/2)] >> (find_bit((k-3)/2)&1))){
printf("must print\n");
}
marks[find_container((k-3)/2)] |= 1<<find_bit((k-3)/2);

if (~(marks[find_container((k-3)/2)] >> (find_bit((k-3)/2)&1))){
printf("this shouldn't have been printed\n");
}
....

打印:

must print

this shouldn't have been printed

很明显,if 语句不采用位值表达式。

好吧,我尝试将位值转换为 bool (~(bool)((marks[find_container((k-3)/2)] >> (find_bit((k -3)/2)&1))) 但它并没有改变这种行为。

最初marks 数组中的所有值都设置为零

marks = (char *)calloc( chars, (sizeof(char)));

chars 是一个unsigned long int

那么我怎样才能让 if 语句使用位表达式呢?

最佳答案

(find_bit((k-3)/2)&1)

是 0 或 1。

我认为您放错了括号,而您正在寻找

(marks[find_container((k-3)/2)] >> find_bit((k-3)/2)) & 1

我建议你添加抽象函数来操作位,它使代码更易读,更不容易出错。
像这样。

// No safety, for clarity
void set(unsigned long int* bits, size_t which)
{
bits[find_container(which)] |= 1 << find_bit(which);
}

bool get(unsigned long int* bits, size_t which)
{
return (bits[find_container(which)] >> find_bit(which)) & 1;
}

// example
if (!get(marks, k))
{
set(marks, k);
}

关于c++ - 如何使用位来表示控制语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26801023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com