首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用位来表示控制语句?

如何使用位来表示控制语句?
EN

Stack Overflow用户
提问于 2014-11-07 12:12:21
回答 2查看 137关注 0票数 0

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

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

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

代码语言:javascript
复制
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数组中的所有值都设置为零。

代码语言:javascript
复制
marks = (char *)calloc( chars, (sizeof(char)));

charsunsigned long int

那么,如何使用if语句使用位表达式呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-07 13:05:51

代码语言:javascript
复制
(find_bit((k-3)/2)&1)

不是0就是1。

我想你把括号放错了,你在找

代码语言:javascript
复制
(marks[find_container((k-3)/2)] >> find_bit((k-3)/2)) & 1

我建议您添加用于操作位的抽象函数,这样可以使代码更加可读性更强,更容易出错。

就像这样。

代码语言:javascript
复制
// 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);
}
票数 1
EN

Stack Overflow用户

发布于 2014-11-07 12:32:35

是的,可以在if中使用任何值,不等于零的值被认为是真的。

但是你怎么知道那些代码都在做什么,这是我无法理解的。有窃听器的几率很高。

我建议编写一些单独的函数来读取/清除/设置数组中的特定位。那么你所做的事情就会变得更清楚了。

顺便说一句,如果这是c代码,则不应该转换calloc的结果。另一方面,如果它是C++代码,则不应该使用C样式的强制转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26801023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档