нельзя использовать == вместо унарного &, чтобы проверить, равны ли два значения - PullRequest
2 голосов
/ 16 сентября 2011

Недавно я наткнулся на фрагмент кода в книге, который задает значение Boolean для поля, подобного этому

вход identifier равен List из String с

if (identifier.size() >= 2) {
    int c = Integer.parseInt(identifier.get(1));
    bulk = (c & 4) == 4;
    hazardous = (c & 2) == 2;
    toxic = (c & 1) == 1;
}

зачем здесь унарные операторы и операторы? Разве это не может быть сделано с помощью простого c==4 и т. Д. Вместо (c & 4)== 4?

Ответы [ 4 ]

9 голосов
/ 16 сентября 2011

Нет, это побитовая операция.

Представьте себе c=7.В этом случае все условия будут истинными.

c = 7;
bulk = (c & 4) == 4; // true
hazardous = (c & 2) == 2; //true
toxic = (c & 1) == 1; //true

В двоичном коде вы получите следующее:

c = 0111; //4-bit to simplify output
bulk = (c & 0100) == 0100; //
hazardous = (c & 0010) == 0010; //true
toxic = (c & 0001) == 0001; //true

Из-за побитового И (&) вы получите 0111 & 0010 = 0010 и т. Д.

2 голосов
/ 16 сентября 2011

Это добавлено для битовой маскировки

если с = 3, то также это будет считаться токсичным с этим

 toxic = (c & 1) == 1;

если вы напишите

 toxic = c  == 1;

тогда это будет stcict 1 check

1 голос
/ 16 сентября 2011

c == 4 проверяет, равно ли c 4, что означает, что двоичная форма c равна 000 ... 00100. (c & 4) == 4, если двоичная форма c имеет вид xxx ... xx1xx.

1 голос
/ 16 сентября 2011

Переменная c явно является битовой маской .Эффект выполнения побитового & заключается в маскировании других битов, оставляя только один бит установленным.Например, этот оператор:

    bulk = (c & 4) == 4;

проверяет, установлен ли бит 2 из c (и не заботится о других битах) - бит 2 является битом 1 в этом байте: 00000100

...