2015-06-01 3 views
0

Я пишу функцию для печати бит, но я столкнулся с проблемой. Два цикла цикла кажутся мне идентичными, но по какой-то причине тот, который закомментирован, не печатает правильные биты.Почему изменение в инструкции if этого побитового действия вызывает ошибку?

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 << " "; 
     } 
    }*/ 
} 
+1

Учитывая начальное значение 'mask',' mask & bit' является либо 'mask', либо' 0'. Большую часть времени 'mask' не равен 1. –

+0

Попробуйте выполнить код в отладчике и проверив аргумент инструкции' if'. –

+0

Замените '== 1' на' == mask' или '! = 0'. – dasblinkenlight

ответ

1

Причина очень проста: значение маски может начать на что-то вроде 128, то сразу смещенной на 64, 32 и т.д .. Таким образом, в ...

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

... если замаскированный бит установлен побитовым И вернет бит маски, и все работает так, как надеялись. Но в ...

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

поразрядное И возвращает бит маски, которые могут быть больше, чем 1: например 128 != 1, и даже если бит вы тестируете установлен вы ошибочно думаете, что это прочь. Единственный раз, когда это произойдет, когда mask, наконец, был сдвинут вправо до 1.

+0

Отличное спасибо! – wazeeer

Смежные вопросы