为什么这个按位操作的if语句的变化会导致错误

why does a variation in the if statement of this bitwise operation cause an error?

本文关键字:变化 错误 语句 if 位操作 为什么      更新时间:2023-10-16

我正在写一个函数来打印位,但我遇到了一个问题。这两个for循环在我看来是一样的,但由于某种原因,被注释掉的那个没有打印正确的位。

int main()
{
unsigned int bits = 0x570FA1; 
unsigned int mask = 0x800000;
printBits(bits, 24, mask);
  return 0;
}
void printBits(unsigned int bit, int numbOfBits, unsigned int& mask){

   for (int i = 1; i <= numbOfBits; i++){
       if ((mask & bit) == 0 ){
            cout << "0";
       }
       else {
       cout <<"1";
       }
       mask = mask >> 1;
       if ( i %4 == 0 ){
        cout << " ";
       }
   }
/*   for(int i= 1 ; i <= numbOfBits ; i++ ){
         if ((mask & bit) ==1){
            cout << "1";
         }
         else{
            cout << "0";
         }
      mask = mask >> 1;
      if(i% 4 ==0){
         cout << " ";
      }
   }*/
}

原因很简单:掩码值可能从128开始,然后右移到64、32等等。所以,在…

if ((mask & bit) == 0 ){

…如果设置了掩码位,按位与运算将返回掩码位,一切都如预期的那样工作。但在…

if ((mask & bit) ==1){

按位与返回可能大于1的掩码位:例如128 != 1,即使您正在测试的位是设置的,您也错误地认为它是关闭的。只有当mask最终右移到1时,它才会起作用。