如何将位用于控制语句表达式
How to use bits for control statement expression?
我使用这个答案中的指令来获取和设置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 printn");
}
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 printedn");
}
....
打印:
必须打印
这不应该打印
很明显,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);
}
是的,你可以在if中使用任何值,不等于零的值都被认为是真的。
但我无法判断这些代码在做什么。出现错误的可能性很高。
我建议编写一些单独的函数来读取/清除/设置数组中的特定位。然后应该会更清楚你在做什么。
顺便说一句,如果这是c代码,就不应该强制转换calloc的结果。另一方面,如果是C++代码,则不应该使用C样式的强制转换。
相关文章:
- 是否可以使用if constexpr删除控制流语句
- 优化/减少 if 语句中的条件表达式
- C++使用逗号运算符的多个控制语句
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- 如何使C++调试语句显示在 gdb 控制台中
- "()"如何在C++中将语句转换为表达式?
- 代码样式:在 switch/if 语句的分支中重用控件表达式或控制变量
- 控制语句样式错误
- 如果语句表达式调用函数,则需要测试是否为 true
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- if 语句中的复合表达式
- 重构模板函数中的常量表达式 if 语句
- 循环try..catch ..确保输入有效或使用控制语句
- C :在控制语句之后,循环的行为不同
- 如何仅使用循环/控制语句和两个cout语句创建一个倒三角:一个输出“#”和一个输出' n'
- 当唯一的区别是循环控制语句(在循环主体中具有相同的语句)时,避免代码重复
- 如何将位用于控制语句表达式
- Eclipse控制语句大括号缩进不正确
- 为什么我得到“操作可能未定义”?c++中的语句表达式
- 在clang-format中控制语句之后中断