浏览 Gayle Laakmann McDowell 所著的“Cracking the coding interview”一书,在位操作一章中,它提出了一个问题:
求(假设数字用 4 位表示)的值:
1011 & (~0 << 2)
现在,~0 = 1 并将其向左移动两次产生 100(= 0100 完成 4 位)。将 1011 与 0100 相加等于 0000。
但是,我的答案是 1000。
浏览 Gayle Laakmann McDowell 所著的“Cracking the coding interview”一书,在位操作一章中,它提出了一个问题:
求(假设数字用 4 位表示)的值:
1011 & (~0 << 2)
现在,~0 = 1 并将其向左移动两次产生 100(= 0100 完成 4 位)。将 1011 与 0100 相加等于 0000。
但是,我的答案是 1000。
~0
不是 1 而是1111
(或0xf
)。该~
运算符是按位NOT 运算符,而不是逻辑运算符(应该是!
)。
因此,当向左移动 2 位时,最后四位是1100
。并且1100 & 1011
是精确的1000
。
~0
不等于 1。0
将默认为整数,并且 NOT 操作将反转所有位,而不仅仅是第一个。
~
是按位补码运算符。
的值~0
应为1111
4 位。
1011 & (~0 << 2)
= 1011 & ( 1111 << 2)
= 1011 & 1100
= 1000
1011 & (~0 << 2)
~0
不是 1 而是1111
2或0xF
16。1111
两次给出1100
(最左边的两个位已被删除并从右边用 0 填充)。1011 & 1100
在对应的位位置为 1 的每个位位置中给出 1,否则为 0。由此得出结果为1000
。