【问题标题】:How to use bitwise operators to return a 0 or 1如何使用按位运算符返回 0 或 1
【发布时间】:2011-08-27 13:53:10
【问题描述】:

我的函数采用 32 位 int,如果该数字在任何偶数位置有 1,我需要返回 0 或 1。我不能使用任何条件语句,我也一次只能访问 8 位。

这是一个示例输入: 10001000 01011101 00000000 11001110

1) 用 AA(10101010) 移动位和它们,并将每个位存储在一个变量中。

int a = 10001000
int b = 1000
int c = 0
int d = 10001010

现在如果没有设置奇数位,我需要返回 0,如果有,则返回 1。正如我们所看到的那样。所以我需要将这些组合成一个数字,然后使用 !!运算符返回 0 或 1。这就是我遇到问题的地方。

int valueToReturn = a | b | c | d;

现在我要说:

return !!valueTOReturn; 

这不是返回正确的值,谁能给我任何见解???

我不能使用任何条件语句,如 || &&

我想通了。我所说的一切都给出了正确的答案,但我为我的一个变量获取了错误的值。感谢大家的帮助!

【问题讨论】:

  • 如果是,请将其标记为“家庭作业”。
  • 为什么要做作业,现在是夏天 - 没有学校 xD
  • 可以使用比较运算符吗?
  • 你能发布 AA() 的 impl 吗? a,b,c,d 的值可能不正确。

标签: c bit-manipulation bitwise-operators truthtable


【解决方案1】:

首先,您并没有按照您的想法存储位。

int a = 10001000

实际上是 10,001,000(二进制为 b100110001001101001101000)。

您说该函数接受一个 32 位整数,所以您可以像这样提取每个 8 位部分:

unsigned char a, b, c, d;
a = (unsigned char)(input & 0xff);
b = (unsigned char)((input >> 8) & 0xff);
c = (unsigned char)((input >> 16) & 0xff);
d = (unsigned char)((input >> 24) & 0xff);

现在您可以执行屏蔽/测试操作了:

return (0xAA & a) | (0xAA & b) | (0xAA & c) | (0xAA & d);

【讨论】:

    【解决方案2】:

    但是,我不知道我是否理解正确,如果 a 有 32 位数字,则只有在为 0 时才能将所有位关闭。

    if(input_number == 0 )
    return 0;
    else 
    return 1;
    

    【讨论】:

      【解决方案3】:

      正如 bdares 所说,这只是很多按位运算...evenbit_int 计算为请求的值。

      #define evenbit_byte(x) (((x) >> 1 | (x) >> 3 | (x) >> 5 | (x) >> 7) & 1)
      #define evenbit_int(x) (evenbit_byte(x) | evenbit_byte(x >> 8) | evenbit_byte(x >> 16) | evenbit_byte(x >> 24))
      

      或稍微优化

      byte evenbits(DWORD x)
      { 
        byte a = x >> 8;    
        byte b = x >> 16;    
        byte c = x >> 24;
        return (evenbit_byte(x) | evenbit_byte(a) | evenbit_byte(b) | evenbit_byte(c))
      }
      

      【讨论】:

      • 当然byte evenbits(DWORD x) { x = x | x >> 8 | x >> 16 | x >> 24); return evenbit_byte(x); } 更好。在审查之前,您不会看到混乱......
      【解决方案4】:

      如果你不能使用条件,你将不得不以丑陋的方式做到这一点:获取每个偶数索引位的位并返回它们的 OR。你可以跳过面具。不过这有点愚蠢,而且家庭作业做得很糟糕。

      编辑了我的答案以删除错误的第一部分。

      看来 arnaud576875 的逻辑是正确的!运营商:http://www.gnu.org/s/gnu-c-manual/gnu-c-manual.html#The-Logical-Negation-Operator

      直到有人可以找到 C99 规范参考(GNU 实现可能会偏离它),我想我不能确定,但​​我怀疑您的 C 版本与我之前描述的一样。

      【讨论】:

      • 我不能使用条件语句:(
      • @bdares 你确定要否定吗?这不是一点点。我相信!a 如果a == 0 评估为1,否则评估为0return !!valueTOReturn; 对我来说是正确的。见stackoverflow.com/questions/2319766/…
      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 2022-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2011-08-28
      • 2013-01-21
      • 1970-01-01
      相关资源
      最近更新 更多