[Algorithm] Math - Data Structure

수학 비트조작

Posted by lim.Chuck on September 18, 2024

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.