k& r练习2-6" setbits"

时间:2016-06-10 00:51:53

标签: c binary kernighan-and-ritchie

我在这里看到了答案:http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_2:Exercise_6

我已经测试了第一个,但在这部分中:

x = 29638;
y = 999;
p = 10;
n = 8;

return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n)))))

在一篇论文中它给了我一个6,但在程序中它返回28678 ......

在这一部分:

 111001111000110
&000100000000111

在结果中,最左边的三个位必须是x中的1,但按位运算符&表示:

  

如果所有操作数的相应位为1,则按位AND的输出为1.如果操作数的任一位为0,则相应位的结果将计算为0。

那么为什么它会以1中的3位返回数字?

1 个答案:

答案 0 :(得分:2)

这里我们一步一步(使用16位数字)。我们从:

开始
(x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n)))))

用数字代替(十进制):

(29638 & ((~0 << (10 + 1)) | (~(~0 << (10 + 1 - 8)))))

总计位移量给出:

(29638 & ((~0 << 11) | (~(~0 << 3))))

将数字重写为二进制并应用~0 s ...

(0111001111000110 & ((1111111111111111 << 1011) | (~(1111111111111111 << 0011))))

在完成轮班后,我们得到:

(0111001111000110 & (1111100000000000 | (~ 1111111111111000)))

应用其他按位-NOT(~):

(0111001111000110 & (1111100000000000 | 0000000000000111))

按位OR(|):

0111001111000110 & 1111100000000111

最后是按位-AND(&):

0111000000000110

所以我们有二进制01110000000001102 + 4 + 4096 + 8192 + 1638428678

相关问题