c中按位运算的说明

时间:2014-10-21 04:04:23

标签: c binary bit-manipulation bitwise-operators

所以我一直在研究这个审核问题,并且无法提供所提供的答案。 我理解他们正在做的操作来反转十六进制数字,但是我在他们用来获得下一个奇数大于它的方法上丢失了。

我对此感到困惑:

 unsigned char ones = !0; 
 ...
 ones = ones <<2 <<2;
 ones |= !0;
 results |= ones;

什么是!0?这不是0吗?以及如何将其转移/与其他部分联系起来?

谢谢

enter image description here

3 个答案:

答案 0 :(得分:1)

我认为您应该知道!0是一种模糊的说法1(或不是false)。

printf("%i\n", !0);

有一次C没有stdbool

答案 1 :(得分:1)

根据C标准(6.5.3.3一元算术运算符)

  

5逻辑否定运算符的结果!如果值为0,则为0   它的操作数比较不等于0,1如果是其操作数的值   比较等于0.结果类型为int。表达式!E是   相当于(0 == E)。

因此!0产生1。

让我们假设函数的参数是0x3C

陈述后

unsigned char ones = !0;

ones将等于0x01

陈述后

unsigned char result = val << 2 << 2;

result将等于0xC0

陈述后

unsigned cgar temp = val >> 2 >> 2;

temp将等于0x03

陈述后

result += temp;

ewsult将等于0xC3

result的反向值val反过来0x3C

其余语句将每个十六进制数字的最低位设置为1例如

ones = ones << 2 << 2;

收益0x10

所以你得到的结果将等于0xD3(3已经最低位等于1而C将被转换为D)。

答案 2 :(得分:0)

好吧,现在就把它弄清楚并理解这个解决方案。这就是我已经制定并尝试向自己解释的内容。 (忽略相反,因为我觉得与这部分相比非常简单)

那些= 0000 0001

一旦你转移&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

一旦你| =那个!0(0000 0001)你得到0001 0001.那么它在(2 ^ 0)点有一个1,这是问题的奇怪部分。

然后从那里你| = 0001 0001与反转,以确保它是下一个奇数,因为x | 1将是1