Тестирование значений с & 1 << 0? - PullRequest
1 голос
/ 19 марта 2019

Я новичок в битовых операциях и наткнулся на что-то интересное.Предположим следующее:

unsigned char A;
unsigned char B;

if(A & 1 << 0){
    //testing
}

Почему всегда необходимо иметь variable & 1<<0?Есть ли случай, когда этого не требуется?Предположим, у нас есть:

unsigned char temp;
temp = ~A & ~B;

, и мы собираемся проверить временную температуру.В чем разница при тестировании temp отдельно от тестирования только бита 0 с temp & 1<<0?

Спасибо!

1 Ответ

2 голосов
/ 19 марта 2019

1<<0 бессмысленно, сдвиг 1 левого нулевого бита не имеет никакого эффекта.

1<<0 == 1

Ниже будет работать идентично

unsigned char A;
unsigned char B;

if(A & 1){
    //testing
}

Это единственный&, которая делает это побитовой операцией, а не операцией сдвига влево (<<)

Если вы хотите проверить, например, бит 7, вы можете сделать это двумя способами:

if (A & 128) {

или

if (A & (1<<7)) {

В случае последнего, так как он использует постоянные значения, компилятор просто разогнал бы это до 128 и полностью исключил бы shl, так что все довы, который вы хотели бы использовать в зависимости от кода и вашего стиля кодирования.

...