비트 조작

7923 단어

비트 가져오기



이 방법은 해당 비트를 0번째 위치로 이동합니다. 그런 다음 0001과 같은 비트 패턴을 가진 하나와 AND 연산을 수행합니다. 이렇게 하면 원래 번호에서 해당 비트를 제외한 모든 비트가 지워집니다. 해당 비트가 1이면 결과는 1이고, 그렇지 않으면 결과는 0입니다.

비트 설정



이 메서드는 bitPosition 비트만큼 1을 이동하여 00100처럼 보이는 값을 만듭니다. 그런 다음 특정 비트를 1로 설정하는 OR 연산을 수행하지만 숫자의 다른 비트에는 영향을 주지 않습니다.

클리어 비트



이 방법은 bitPosition 비트만큼 1을 이동하여 00100처럼 보이는 값을 생성합니다. 그보다 이 마스크를 반전하여 11011처럼 보이는 숫자를 얻습니다. 그런 다음 AND 연산이 숫자와 마스크 모두에 적용됩니다. 이 작업은 비트를 설정 해제합니다.

비트 업데이트



이 방법은 "비트 지우기"와 "비트 설정"방법의 조합입니다.

짝수이다



이 메서드는 제공된 숫자가 짝수인지 확인합니다. 홀수는 마지막 오른쪽 비트가 1로 설정된다는 사실에 기반합니다.

Number: 5 = 0b0101
isEven: false

Number: 4 = 0b0100
isEven: true


isPositive



이 방법은 숫자가 양수인지 확인합니다. 모든 양수에는 0으로 설정되는 맨 왼쪽 비트가 있다는 사실에 기반합니다. 그러나 제공된 숫자가 0 또는 음수 0이면 여전히 false를 반환해야 합니다.

Number: 1 = 0b0001
isPositive: true

Number: -1 = -0b0001
isPositive: false


2로 곱하기



이 방법은 원래 숫자를 왼쪽으로 1비트 이동합니다. 따라서 모든 이진수 구성 요소(2의 거듭제곱)에 2가 곱해지고 따라서 숫자 자체에 2가 곱해집니다.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0

After the shift
Number: 0b1010 = 10
Powers of two: 2^3 + 0 + 2^1 + 0


2로 나누기



이 방법은 원래 숫자를 오른쪽으로 1비트 이동합니다. 따라서 모든 이진수 구성 요소(2의 거듭제곱)는 2로 나누어지고 따라서 숫자 자체는 나머지 없이 2로 나뉩니다.

Before the shift
Number: 0b0101 = 5
Powers of two: 0 + 2^2 + 0 + 2^0

After the shift
Number: 0b0010 = 2
Powers of two: 0 + 0 + 2^1 + 0


스위치 사인



이 방법은 양수를 음수 및 역방향으로 만듭니다. 그렇게 하기 위해 숫자의 모든 비트를 반전하고 거기에 1을 더하는 "2개의 보수"접근 방식을 사용합니다.

1101 -3
1110 -2
1111 -1
0000  0
0001  1
0010  2
0011  3


두 개의 부호 있는 숫자 곱하기



이 메서드는 비트 연산자를 사용하여 두 개의 부호 있는 정수를 곱합니다. 이 방법은 다음 사실을 기반으로 합니다.

a * b can be written in the below formats:
  0                     if a is zero or b is zero or both a and b are zeroes
  2a * (b/2)            if b is even
  2a * (b - 1)/2 + a    if b is odd and positive
  2a * (b + 1)/2 - a    if b is odd and negative


이 접근 방식의 장점은 각 재귀 단계에서 피연산자 중 하나가 원래 값의 절반으로 감소한다는 것입니다. 따라서 런타임 복잡도는 O(log(b))입니다. 여기서 b는 각 재귀 단계에서 절반으로 감소하는 피연산자입니다.

참고문헌



https://github.com/trekhleb/javascript-algorithms/tree/master/src/algorithms/math/bits

좋은 웹페이지 즐겨찾기