숫자의이진수 각 비트를 연산하며 오직 정수 타입에만 사용합니다
비트 연산자 및 시프트 연산자 표
| 연산자 | 이름 | 연산 규칙 |
|---|---|---|
& | 비트 AND | 서로 대응하는 이진 비트가모두 1일 때만 결과 비트가 1이고, 나머지 경우는 0 |
| | | 비트 OR | 서로 대응하는 이진 비트 중어느 한쪽이라도 1이면 결과 비트가 1, 둘 다 0일 때만 결과가 0 |
^ | 비트 XOR (배타적 논리합) | 서로 대응하는 이진 비트의 값이서로 다르면1, 값이 같으면 0 |
~expr | 비트 반전 (단항 연산자) | 모든 이진 비트를 서로 뒤집습니다 0 ↔ 1, 0은 1로, 1은 0으로 변환 |
<< | 왼쪽 시프트 Shift left | 전체 이진 문자열을 N비트 만큼 왼쪽으로 이동하고 오른쪽 빈 자리는 0으로 채움 |
>> | 부호 있는 오른쪽 시프트 Shift right | 전체 이진 문자열을 N비트 만큼 오른쪽으로 이동, 왼쪽 빈 자리는부호 비트로 채움 (양수는 0, 음수는 1) |
>>> | 부호 없는 오른쪽 시프트 Unsigned shift right | 이진 전체를 N비트 오른쪽으로 이동하고 왼쪽은 항상 0으로 채움; 음수는 먼저 부호 없는 32비트 정수로 변환한 뒤 시프트 연산 진행 |
비트 AND 연산자 (&)
서로 대응하는 두 비트가 모두 1일 때만 결과 비트가 1이고, 어느 한쪽이라도 0이면 결과 비트는 0입니다.
| 첫 번째 숫자 (비트) | 두 번째 숫자 (비트) | 연산 결과 |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
예시
void main() {
// 단일 비트 연산 검증
assert((1 & 1) == 1);
assert((1 & 0) == 0);
assert((0 & 1) == 0);
assert((0 & 0) == 0);
// 다중 비트 정수 연산 예시
final a = 0x22; // 이진수 00100010
final b = 0x0f; // 이진수 00001111
assert((a & b) == 0x02); // 결과 00000010
}Code language: PHP (php)
비트 OR 연산자 (|)
대응하는 두 비트 중 하나라도 1이면 결과 비트가 1이고, 둘 다 0일 때만 결과가 0입니다.
| 첫 번째 숫자 (비트) | 두 번째 숫자 (비트) | 연산 결과 |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
void main() {
// 단일 비트 연산 검증
assert((1 | 1) == 1);
assert((1 | 0) == 1);
assert((0 | 1) == 1);
assert((0 | 0) == 0);
// 다중 비트 정수 연산 예시
final a = 0x22; // 이진수 00100010
final b = 0x0f; // 이진수 00001111
assert((a | b) == 0x2f); // 결과 00101111
}Code language: PHP (php)
비트 XOR 연산자 (^)
대응하는 두 비트의 값이 서로 다르면 결과 비트가 1이고, 값이 같으면 0입니다.
| 첫 번째 숫자 (비트) | 두 번째 숫자 (비트) | 연산 결과 |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
예시
void main() {
// 단일 비트 연산 검증
assert((1 ^ 1) == 0);
assert((1 ^ 0) == 1);
assert((0 ^ 1) == 1);
assert((0 ^ 0) == 0);
// 다중 비트 정수 연산 예시
final a = 0x22; // 이진수 00100010
final b = 0x0f; // 이진수 00001111
assert((a ^ b) == 0x2d); // 결과 00101101
}Code language: PHP (php)
비트 반전 연산자 (~)
단항 연산자로 피연산자가 한 개만 필요하며, 모든 이진 비트를 하나씩 뒤집습니다: 0 → 1, 1 → 0.
| 원본 비트 | 반전된 비트 |
|---|---|
| 1 | 0 |
| 0 | 1 |
예시
void main() {
// 단일 비트 연산 검증
assert((~1 & 1) == 0);
assert((~0 & 1) == 1);
// 다중 비트 정수 연산 예시
final a = 0x22; // 이진수 00100010
final mask = 0x0f; // 이진수 00001111
assert((a & ~mask) == 0x20); // mask 반전 후 AND 연산, 하위 4비트 제거
}Code language: PHP (php)
전체 예시 확인
void main() {
// 테스트 값 정의
final value = 0x22; // 16진수 0x22 = 10진수 34, 이진수 00100010
final bitmask = 0x0f; // 16진수 0x0f = 10진수 15, 이진수 00001111
// 1. 비트 AND &
print('value & bitmask = ${value & bitmask}'); // 0x02 = 2
assert((value & bitmask) == 0x02);
// 2. 반전 마스크 AND (& ~mask, 하위 비트 삭제에 자주 사용)
print('value & ~bitmask = ${value & ~bitmask}'); // 0x20 = 32
assert((value & ~bitmask) == 0x20);
// 3. 비트 OR |
print('value | bitmask = ${value | bitmask}'); // 0x2f = 47
assert((value | bitmask) == 0x2f);
// 4. 비트 XOR ^
print('value ^ bitmask = ${value ^ bitmask}'); // 0x2d = 45
assert((value ^ bitmask) == 0x2d);
// 5. 왼쪽 시프트 <<
print('value << 4 = ${value << 4}'); // 0x220 = 544
assert((value << 4) == 0x220);
// 6. 부호 있는 오른쪽 시프트 >> (양수)
print('value >> 4 = ${value >> 4}'); // 0x02 = 2
assert((value >> 4) == 0x02);
// 7. 부호 있는 오른쪽 시프트 >> (음수, 플랫폼마다 동작 차이 존재)
print('-value >> 4 = ${-value >> 4}'); // -0x03 = -3
assert((-value >> 4) == -0x03);
// 8. 부호 없는 오른쪽 시프트 >>> (양수, Dart2.14 이상 지원)
print('value >>> 4 = ${value >>> 4}'); // 0x02 = 2
assert((value >>> 4) == 0x02);
// 9. 부호 없는 오른쪽 시프트 >>> (음수, 결과는 항상 0보다 큼)
print('-value >>> 4 = ${-value >>> 4}');
assert((-value >>> 4) > 0);
}Code language: PHP (php)
실행 출력 결과
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
value & bitmask = 2
value & ~bitmask = 32
value | bitmask = 47
value ^ bitmask = 45
value << 4 = 544
value >> 4 = 2
-value >> 4 = -3
value >>> 4 = 2
-value >>> 4 = 1152921504606846973
각 예시 단계별 분석 설명
1 비트 AND
00100010
00001111
--------
00000010
최종 결과는 00000010, 즉 10진수 2 입니다.
2 반전 마스크 비트 AND & ~mask
00100010
11110000 // ~00001111
---------
00100000 // 0x20 = 32Code language: JavaScript (javascript)
11110000 은 ~mask 연산 결과로, 원본 00001111의 모든 비트를 반전시켜 0은 1로, 1은 0으로 바꾼 값입니다.
3 비트 OR |
00100010
00001111
---------
00101111 // 0x2f = 47Code language: JavaScript (javascript)
어느 한쪽 비트라도 1이면 결과가 1이고, 둘 다 0일 때만 결과가 0입니다.
4 비트 XOR ^
00100010
00001111
---------
00101101 // 0x2d = 45Code language: JavaScript (javascript)
위아래 비트 값이 서로 다르면 1, 같으면 0이 됩니다.
5 왼쪽 시프트 << 4
00100010 << 4 = 001000100000
결과: 0x220 = 544
6 부호 있는 오른쪽 시프트 >> 4 (양수)
00100010 >> 4 = 00000010
결과: 0x02 = 2
7 부호 있는 오른쪽 시프트 >> 4 (음수)
-00100010 >> 4 = -00000011
결과: -0x03 = -3
8 부호 없는 오른쪽 시프트 >>> 4 (양수)
00100010 >>> 4 = 00000010
결과: 0x02 = 2
9 부호 없는 오른쪽 시프트 >>> 4 (음수)
-00100010 >>> 4 = (왼쪽을 0으로 채움) 00001101... // 결과는 항상 0보다 크다Code language: JavaScript (javascript)
Previous: Dart 논리 연산자
Next: Dart 조건 표현식