我正在写一个小程序来获得一些位操作的经验,我遇到了这种情况。我试图创建一个掩码,将0的所有位从MSB设置为某个数字n。当我的n是32时,问题就出现了。这里有一些代码可以证明这个问题。
int n = (sizeof(int) * 8) - 0; //Here n is basically set to 32.
std::cout << n << std::endl; //And indeed, this prints 32.
//here I expect to see 0 (basically all 32 bits of the number should be 0`s, but I see the opposite, all bits are set to 1.)
std::cout << ((unsigned) ~0 >> n) << std::endl;
//And this indeed does what I expected and all 32 bits of the nuber are set to 0`s.
std::cout << ((unsigned) ~0 >> 32) << std::endl;
我的问题是,因为n = 32,为什么我在这里看到2个不同的结果,其中第一个我看到32 s and in the 2nd case, I am seeing 32 0
s?
答案 0 :(得分:0)
编辑:显然这是错的,原始海报测试了它(谢谢!)。如果有人有更好的解释,我会把它留作一个想法。
我认为你没有考虑你的类型被投放到什么地方。 您可能在64位计算机上执行此操作,因此n是32位无符号整数,但数字32是64位长整数。
~0
成为无符号整数(32位)
n
是32位无符号整数
32
(可能)是64位长
组合~0
(32位)和n
(32位)可能会给出32位的答案
而组合~0
(32位)和32
(64位)给出了64位的答案
如您对问题的评论中所述,将数字移位所有位是未定义的行为,但将它们移位到64位整数32位应该可以正常工作! < / p>
这是我最好的猜测,我没有对此进行测试。