我有一个简单而简短的问题。
我们有这个密码

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。

07-27 22:57