所以我一直在研究这个审核问题,并且无法提供所提供的答案。 我理解他们正在做的操作来反转十六进制数字,但是我在他们用来获得下一个奇数大于它的方法上丢失了。
我对此感到困惑:
unsigned char ones = !0;
...
ones = ones <<2 <<2;
ones |= !0;
results |= ones;
什么是!0?这不是0吗?以及如何将其转移/与其他部分联系起来?
谢谢
答案 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