我有一个简单而简短的问题。
我们有这个密码
void fun( unsigned value )
{
unsigned c, displayMask = 1; // 1
for ( c = 1; c <= 32; c++ )
{
putchar( value & displayMask ? '1' : '0' );
displayMask <<= 1;
if ( c % 8 == 0 )
putchar( ' ' );
}
putchar( '\n' );
}
此函数打印任何无符号数字的二进制值,但该值是反转的。也就是说,如果插入
5
,则它将打印101
,后跟29个零。问题是,如果我们用
displayMask = 1
代替displayMask = 1 << 31 << 1
(这里的// 1
注释是)输出是什么?正确的答案是,不管您插入了什么值,它都会打印32个零。但我不明白为什么。
如果我们先写
displayMask = 1 << 31 << 1
,然后开始是000...1
,然后我们旋转31次,现在是100...0
,然后我们再次旋转,使1返回到开始,我们再次得到000...1
。我的逻辑怎么了? 最佳答案
<<
不是位旋转而是位移位。因此100...0 << 1
是0,而不是1。