我在这里看到了答案: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位返回数字?
答案 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
所以我们有二进制0111000000000110
,2 + 4 + 4096 + 8192 + 16384
,28678
。