Dart 비트 연산자 및 시프트 연산자

숫자의이진수 각 비트를 연산하며 오직 정수 타입에만 사용합니다

비트 연산자 및 시프트 연산자 표

연산자이름연산 규칙
&비트 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입니다.

첫 번째 숫자 (비트)두 번째 숫자 (비트)연산 결과
111
100
010
000

예시

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입니다.

첫 번째 숫자 (비트)두 번째 숫자 (비트)연산 결과
111
101
011
000
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입니다.

첫 번째 숫자 (비트)두 번째 숫자 (비트)연산 결과
110
101
011
000

예시

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.

원본 비트반전된 비트
10
01

예시

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)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다