[Algorithm] Math - Data Structure

수학 비트조작

2024년 09월 18일 · lim.Chuck

Bit Manipulation?

비트 조작(Bit Manipulation)은 이진 데이터의 비트를 직접 다루는 기술입니다. 이를 통해 특정 숫자의 비트를 설정하거나, 지우거나, 토글하거나 확인하는 작업을 수행할 수 있습니다. 보통 비트 연산자를 사용하여 작업을 합니다.

주요 비트 연산자:

  • AND (&): 비트를 지우거나 두 피연산자의 해당 비트가 모두 1인지 확인할 때 사용.
  • OR (|): 비트를 설정할 때 사용 (하나의 비트라도 1이면 결과가 1).
  • XOR (^): 비트를 토글할 때 사용 (비트가 다르면 결과가 1).
  • NOT (~): 모든 비트를 반전 (0은 1로, 1은 0으로).
  • Left Shift (<<): 비트를 왼쪽으로 밀어 오른쪽에 0을 추가.
  • Right Shift (>>): 비트를 오른쪽으로 밀어 오른쪽 비트를 버림.

비트 조작의 주요 용도:

  1. 성능 최적화: 비트 연산은 빠르고 메모리 소모가 적습니다.
  2. 플래그 및 비트마스크: 여러 개의 불리언 값을 효율적으로 저장하는 데 자주 사용됩니다.
  3. 암호화: 비트 조작은 암호화 알고리즘의 핵심 부분입니다.
  4. 저수준 프로그래밍: 하드웨어, 파일 형식, 네트워크 프로토콜과 직접 상호작용할 때 유용합니다.

JavaScript 비트 조작 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// AND 연산자를 사용하여 숫자가 짝수인지 홀수인지 확인
function isEven(num) {
  return (num & 1) === 0;
}

console.log(isEven(4)); // true
console.log(isEven(7)); // false

// 특정 비트 토글하기 (예: 2번째 비트 토글)
function toggleBit(num, position) {
  return num ^ (1 << position);
}

let number = 5; // 이진수로 0101
console.log(toggleBit(number, 1)); // 7 출력 (이진수 0111)

Rust 비트 조작 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// AND 연산자를 사용하여 숫자가 짝수인지 홀수인지 확인
fn is_even(num: u32) -> bool {
    (num & 1) == 0
}

fn main() {
    println!("{}", is_even(4)); // true
    println!("{}", is_even(7)); // false

    // 특정 비트 토글하기 (예: 2번째 비트 토글)
    let number: u32 = 5; // 이진수로 0101
    let toggled = number ^ (1 << 1);
    println!("{}", toggled); // 7 출력 (이진수 0111)
}

요약:

비트 조작은 메모리 사용을 효율적으로 하고 빠른 계산을 가능하게 하며, 특히 시스템 레벨 프로그래밍과 성능이 중요한 애플리케이션에서 널리 사용됩니다. JavaScript와 Rust 모두 비트 연산자를 제공하여 저수준의 이진 연산을 직접 처리할 수 있습니다.

Bit Manipulation?

Bit Manipulation involves the direct manipulation of bits within binary data. This technique allows you to perform operations like setting, clearing, toggling, and checking specific bits of a number, typically using bitwise operators.

Common Bitwise Operators:

  • AND (&): Used to clear bits or to check if both corresponding bits of two operands are 1.
  • OR (|): Used to set bits (if either operand bit is 1, the result is 1).
  • XOR (^): Used to toggle bits (if bits are different, the result is 1).
  • NOT (~): Used to invert all bits (0 becomes 1, 1 becomes 0).
  • Left Shift (<<): Shifts bits to the left, adding zeros to the right.
  • Right Shift (>>): Shifts bits to the right, discarding bits on the right.

Common Use Cases for Bit Manipulation:

  1. Performance optimization: Bitwise operations are faster and require less memory.
  2. Flags and Bitmasking: Often used for storing multiple Boolean values efficiently.
  3. Encryption: Bit manipulation is a core part of cryptographic algorithms.
  4. Low-level programming: Useful when interacting directly with hardware, file formats, or network protocols.

Example of Bit Manipulation in JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Check if a number is odd or even using the AND operator
function isEven(num) {
  return (num & 1) === 0;
}

console.log(isEven(4)); // true
console.log(isEven(7)); // false

// Toggle a specific bit (e.g., toggle the 2nd bit)
function toggleBit(num, position) {
  return num ^ (1 << position);
}

let number = 5; // 0101 in binary
console.log(toggleBit(number, 1)); // Outputs 7 (0111 in binary)

Example of Bit Manipulation in Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Check if a number is odd or even using the AND operator
fn is_even(num: u32) -> bool {
    (num & 1) == 0
}

fn main() {
    println!("{}", is_even(4)); // true
    println!("{}", is_even(7)); // false

    // Toggle a specific bit (e.g., toggle the 2nd bit)
    let number: u32 = 5; // 0101 in binary
    let toggled = number ^ (1 << 1);
    println!("{}", toggled); // Outputs 7 (0111 in binary)
}

Summary:

Bit manipulation is widely used for efficient memory usage and fast computation, especially in system-level programming and performance-critical applications. Both JavaScript and Rust provide bitwise operators, allowing you to handle low-level binary operations directly.