논리 연산자 ( ||
및 &&
)와 비트 연산자 ( |
및 &
).
논리 연산자와 비트 연산자의 가장 중요한 차이점은 논리 연산자는 두 개의 부울을 취하고 부울을 생성하는 반면 비트 연산자는 두 개의 정수를 취하고 정수를 생성한다는 것입니다 (참고 : 정수는 int뿐만 아니라 모든 정수 데이터 유형을 의미 함).
반복적으로 비트 단위 연산자는 비트 패턴 (예 : 01101011)을 가져와 각 비트에서 비트 단위 AND / OR을 수행합니다. 예를 들어 두 개의 8 비트 정수가있는 경우 :
a = 00110010 (in decimal: 32+16+2 = 50)
b = 01010011 (in decimal: 64+ 16+2+1 = 83)
----------------
a & b = 00010010 (in decimal: 16+2 = 18)
a | b = 01110011 (in decimal: 64+32+16+2+1 = 115)
논리 연산자는 다음에서만 작동합니다 bool
.
a = true
b = false
--------------
a && b = false
a || b = true
둘째, true와 false가 각각 1과 0과 같기 때문에 bool에서 비트 연산자를 사용하는 것이 종종 가능하며, true를 1로 변환하고 0을 0으로 변환하면 비트 연산을 수행 한 다음 0이 아닌 값을 변환합니다 true로, 0에서 false로; 논리 연산자를 방금 사용한 경우 결과가 동일하게됩니다 (연습을 위해 이것을 점검하십시오).
또 다른 중요한 차이점은 논리 연산자가 단락 되었다는 것 입니다. 따라서 일부 서클에서 [1] 사람들은 종종 다음과 같은 일을하는 것을 보게됩니다.
if (person && person.punch()) {
person.doVictoryDance()
}
어떤로 변환 : "사람이 (즉, null이 아닌)이있는 경우, 그에게 / 그녀에게 펀치를 시도하고 펀치가 (사실 즉, 반환) 성공하면, 다음 승리의 춤을" .
비트 연산자를 대신 사용했다면 다음과 같습니다.
if (person & person.punch()) {
person.doVictoryDance()
}
에 변환합니다 : "사람이 존재하는 경우 (즉, null이 아닌)과 펀치 (사실, 즉 반환), 다음 승리의 춤을 성공한다" .
단락 된 논리 연산자에서 널 (null) 인 person.punch()
경우 코드가 전혀 실행되지 않을 수 있습니다 person
. 실제로,이 특정한 경우, 두 번째 코드는 사람이 null인지 여부에 관계없이 person
호출하려고하기 때문에 널 (null) 인 경우 널 참조 오류를 생성합니다 person.punch()
. 올바른 피연산자를 평가하지 않는 이러한 동작을 단락 이라고 합니다.
[1] 일부 프로그래머는 부작용이있는 함수 호출을 if
표현식 안에 넣는 것에 대해 혼란 스러울 수 있지만, 다른 프로그래머에게는 일반적이고 유용한 관용구입니다.
비트 연산자는 한 번에 32 비트에서 작동하기 때문에 (32 비트 시스템을 사용하는 경우), 예를 들어, 여러 조건을 비교해야하는 경우보다 우아하고 빠른 코드로 이어질 수 있습니다.
int CAN_PUNCH = 1 << 0, CAN_KICK = 1 << 1, CAN_DRINK = 1 << 2, CAN_SIT = 1 << 3,
CAN_SHOOT_GUNS = 1 << 4, CAN_TALK = 1 << 5, CAN_SHOOT_CANNONS = 1 << 6;
Person person;
person.abilities = CAN_PUNCH | CAN_KICK | CAN_DRINK | CAN_SIT | CAN_SHOOT_GUNS;
Place bar;
bar.rules = CAN_DRINK | CAN_SIT | CAN_TALK;
Place military;
military.rules = CAN_SHOOT_CANNONS | CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT;
CurrentLocation cloc1, cloc2;
cloc1.usable_abilities = person_abilities & bar_rules;
cloc2.usable_abilities = person_abilities & military_rules;
// cloc1.usable_abilities will contain the bit pattern that matches `CAN_DRINK | CAN_SIT`
// while cloc2.usable_abilities will contain the bit pattern that matches `CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT`
논리 연산자를 사용하여 동일한 작업을 수행하려면 어색한 비교가 필요합니다.
Person person;
person.can_punch = person.can_kick = person.can_drink = person.can_sit = person.can_shoot_guns = true;
person.can_shoot_cannons = false;
Place bar;
bar.rules.can_drink = bar.rules.can_sit = bar.rules.can_talk = true;
bar.rules.can_punch = bar.rules.can_kick = bar.rules.can_shoot_guns = bar.rules.can_shoot_cannons = false;
Place military;
military.rules.can_punch = military.rules.can_kick = military.rules.can_shoot_guns = military.rules.can_shoot_cannons = military.rules.can_sit = true;
military.rules.can_drink = military.rules.can_talk = false;
CurrentLocation cloc1;
bool cloc1.usable_abilities.can_punch = bar.rules.can_punch && person.can_punch,
cloc1.usable_abilities.can_kick = bar.rules.can_kick && person.can_kick,
cloc1.usable_abilities.can_drink = bar.rules.can_drink && person.can_drink,
cloc1.usable_abilities.can_sit = bar.rules.can_sit && person.can_sit,
cloc1.usable_abilities.can_shoot_guns = bar.rules.can_shoot_guns && person.can_shoot_guns,
cloc1.usable_abilities.can_shoot_cannons = bar.rules.can_shoot_cannons && person.can_shoot_cannons
cloc1.usable_abilities.can_talk = bar.rules.can_talk && person.can_talk;
bool cloc2.usable_abilities.can_punch = military.rules.can_punch && person.can_punch,
cloc2.usable_abilities.can_kick = military.rules.can_kick && person.can_kick,
cloc2.usable_abilities.can_drink = military.rules.can_drink && person.can_drink,
cloc2.usable_abilities.can_sit = military.rules.can_sit && person.can_sit,
cloc2.usable_abilities.can_shoot_guns = military.rules.can_shoot_guns && person.can_shoot_guns,
cloc2.usable_abilities.can_talk = military.rules.can_talk && person.can_talk,
cloc2.usable_abilities.can_shoot_cannons = military.rules.can_shoot_cannons && person.can_shoot_cannons;
비트 패턴과 비트 연산자가 사용되는 전형적인 예는 Unix / Linux 파일 시스템 권한입니다.