位操作(清除n位)

时间:2013-06-16 12:59:23

标签: c++ c bit-manipulation

通过Gayle Laakmann McDowell的书“Cracking the coding interview”,在位操作章节中,它发布了一个问题:

找到值(假设数字由4位表示):

1011 & (~0 << 2)

现在,~0 = 1并向左移动两次产生100(= 0100以完成4位)。安定1011与0100等于0000。

然而,我的答案是1000。

4 个答案:

答案 0 :(得分:8)

~0不是1,而是1111(或0xf)。 ~运算符是按位 NOT运算符,而不是逻辑运算符(可能是!)。

因此,当向左移动2位时,最后4位为11001100 & 1011非常1000

答案 1 :(得分:2)

~0不等于1. 0将默认为整数,NOT操作将反转所有位,而不仅仅是第一位。

答案 2 :(得分:2)

~是按位补语运算符。

~0的值应为4位1111

1011 & (~0 << 2)
= 1011 & ( 1111 << 2)
= 1011 &  1100
= 1000

答案 3 :(得分:2)

1011 & (~0 << 2)
  1. ~0不是1,而是1111 2 0xF 16
  2. 1111向左移动两次会产生1100(最左边的两个位已经被删除并从右边用0填充)。
  3. 添加1011 & 1100在相应位位置为1的每个位位置给出1,否则为0.这样结果为1000