我正在使用this应答中的说明来获取和设置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");
}
....指纹:
必须打印 这个不该印出来的
很明显,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语句使用位表达式呢?
发布于 2014-11-07 13:05:51
(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);
}发布于 2014-11-07 12:32:35
是的,可以在if中使用任何值,不等于零的值被认为是真的。
但是你怎么知道那些代码都在做什么,这是我无法理解的。有窃听器的几率很高。
我建议编写一些单独的函数来读取/清除/设置数组中的特定位。那么你所做的事情就会变得更清楚了。
顺便说一句,如果这是c代码,则不应该转换calloc的结果。另一方面,如果它是C++代码,则不应该使用C样式的强制转换。
https://stackoverflow.com/questions/26801023
复制相似问题