A. 비트 운영 기준
기본 비트 연산자이다 AND, OR, XOR, 역, 왼쪽, 오른쪽,이 여섯, 운영의 자신의 규칙은 다음과 같습니다 :
상징 |
기술 |
운영 규칙 |
및 |
과 |
2 비트 결과는 단지 1, 1이다 |
| |
또는 |
두 개의 비트가 0이고, 결과는 0이었다 |
^ |
XOR |
동일한 두 비트는 0, 1 다르다 |
~ | 부정 | 변수 변수 0 1.1 0 |
<< | 왼쪽 | 각 이진 전체 왼쪽 몇몇 상위 비트는 낮은 0.1 << ^ N은 N = 2, 폐기 |
>> | 권리 | 각 이진 여러 모든 권리, 부호의, 0의 높은 비트 서명 번호, 컴파일러 방식의 각각 다른 일부 보수 부호 비트 (오른쪽 시프트를 산술), 일부 보완 0 (논리 시프트) . 2 승 >> N의 N은 / 2 N 같다 |
참고 :
1. 여섯 개 사업자에서 부정 만 ~ 단항 연산자이며, 나머지 다섯은 이항 연산자입니다.
2. 정형 데이터 비트 연산은 float 형, 사용될 수 있으며, 이중 비트 동작 컴파일러를 설명한다.
II. 공통 비트 운영 팁
간단한 비트 연산
1 '&'기호, X 및 Y는 이진 AND 연산 두 진수, 그리고 그 소수의 값을 반환합니다. 실시 예 3 = (10) (11) 2 (10) 2.
2. '|'기호 X | Y는 이진 OR 연산의 두 진수, 그리고 그 소수의 값을 반환합니다. 실시 예 3 (11) | 2 (10 ) = 3 (11).
3. '^'기호는 X ^ Y, 그것은 이진 배타적 OR 연산에 두 개의 소수, 그리고 그 소수의 값을 반환합니다. 실시 예 3 (11) 2 (10) = 1 (01).
4 '<<'기호 좌측 시프트 연산 << X 2, X는 0으로 채워 진 두 최 우측의 각 비트의 좌측으로 이동되며, X << 2의 상응 네 곱 x를.
따라서, '>>'는 우측 시프트 연산이다 >>. 1 X X 제거 많아야 한 X / 2 이진 대응한다.
III. 기술 요약
1. 정수가 홀수인지 짝수 분석
if ((x & 1) == 0) {
x is even
}
else {
x is odd
}
나는 모두가이 기술을 볼 수있다 확신 해요. 핵심 아이디어는 최하위 비트 (B0)이 정수 1 인 경우, 그 수는 홀수이다. 이진 표현에서 'X'는, (B0) 비트만을 1이거나 0 수 있기 때문이다. 에서 'X'와 AND 연산은 다른 비트 (B0)의 제거에 부가하여 수행 될 수있다. 연산 결과가 0 인 경우 B0은 0이므로, 그 'X'는, 짝수
또는 'X'홀수이다.
의 몇 가지 예를 살펴 보자. 우리는 정수 43을 선택, 그것은 홀수, 이진 표현은 00101011
그 최하위 비트 B0되는 1 (포커스). 그리고 지금은 1 단계가 될 것입니다 :
00101011
& 00000001 (注释: 1 的二进制是 00000001)
--------
00000001
그리고 작업이 그것을 떠날 높은-B1-B7의 B0을 제거하는 방법을 알아보십시오? 결과는 정수가 홀수 것을 우리에게 알려줍니다, 1입니다.
이제 우리는 -43 봐. 음의 2의 보수 이진수를 얻기 신속한 방법에 관한 팁 (1)에 의한 카운터 수의 절대 값을 취한다 (부호 비트가 포지티브 앞에 0을 생략 참고). 그래서 이진 (43)입니다 11010101
당신은 최하위 비트가 1이고, 숫자가 홀수 여전히 볼 수 있습니다 (칠판에 노크 : 우리가 보완을 사용하지 않는 경우, 사실이 아니다).
우리는 98에서, 그것은 이진 코드의 모양 1100010
.
01100010
& 00000001
--------
00000000
연산 결과가 98 비트 (B0)가 0임을 의미하는 0 후에는 짝수이다.
다시 부정, 이진 코드를 시도 -98 10011110
, B0 비트가 0, 계산 결과는 심지어 -98입니다 0입니다.
2. N 비트가 1인지를 판단
if (x & (1<<n)) {
n-th bit is set
}
else {
n-th bit is not set
}
선단에, 우리는 제 1 X 1인지를 통해 결정한다. 이 기술이 향상되어, 어떤 비트가 1인지를 판정 할 수있다. 그 원리는, n은 1 비트 왼쪽으로 시프트되고, 그 후 N 비트 이외의 다른 비트들을 제거하는 것, 주어진 번호와 AND 연산.
다음은 결과의 왼쪽에 1 :
1 00000001 (same as 1<<0)
1<<1 00000010
1<<2 00000100
1<<3 00001000
1<<4 00010000
1<<5 00100000
1<<6 01000000
1<<7 10000000
우리는 (1 ')에서 X'및 n 비트의 좌측 시프트를 AND 처리하면, 유효 n 비트의 다른 비트에 추가하여 'x'를 배제 할 수있다. 연산 결과는 제 n 비트가 1, 그렇지 않으면 0이다 나타내는 0이면.
의 몇 가지 구체적인 예를 살펴 보자.
제 1 (122)는 무엇입니까? 우리의 작업을 수행하는 것입니다 122 & (1<<3)
.
이진 코드 (122)는 01111010
, 1<<3
결과는이다 00001000
.
01111010
& 00001000
--------
00001000
이 결과는 제 3 비트 (122)는 1이고, 0이 아닌 것을 알 수있다.
참고 : 내 글에서, 0부터 카운트를 비트.
그렇게 -33? 그건 제 5 호는 1?
11011111 (-33 in binary)
& 00100000 (1<<5)
--------
00000000
그 결과, 비트는 1~5없고, 0이다.
3. n 번째 비트는 1로 설정되고
y = x | (1<<n)
이 기술은 전술 한 것 이외에는, 제 n 위치를 1로 시프트 연산 (<< 1 N)을 사용하여 &
대체 |
. 1 n 개의 가변 개수의 비트는 상기 제 또는 1로 설정되고, 변수 (n)의 동작 위치의 결과이다. 1 비트 또는 1 상 결과 (), 단계 또는 0의 개수는, 결과가 0이기 때문이다. 이것이 어떻게 작동하는지 보자 :
가정 우리는 120의 번호를 가지고, 그것은 제 2 위치에 원한다.
01111000 (120 in binary)
| 00000100 (1<<2)
--------
01111100
-120 여섯 번째 위치가 1 그것을하면?
10001000 (-120 in binary)
| 01000000 (1<<6)
--------
11001000
4. N 내지 제 0
y = x & ~(1<<n)
이 기술의 핵심이다 ~(1<<n)
의 비트 N 외에 0이며, 다른 하나의 비트가있다.
그것은 다음과 같습니다 :
~1 11111110 (same as ~(1<<0))
~(1<<1) 11111101
~(1<<2) 11111011
~(1<<3) 11110111
~(1<<4) 11101111
~(1<<5) 11011111
~(1<<6) 10111111
~(1<<7) 01111111
n 번째 비트가 0으로 설정된다는 변수 X '' 'X'위상의 결과이다. 상관없이 N 비트 결과의 수는 0 또는 1이고, 0은 0의 위상이다.
이것은하자 제 4127 0으로 설정하는 예이다 :
01111111 (127 in binary)
& 11101111 (~(1<<4))
--------
01101111
5. n 비트의 값은 부정
y = x ^ (1<<n)
이 기술은 여전히 "N- 비트 값으로 설정"되지만, 이는 'X'변수와 XOR 연산된다. 모든 두 숫자가 동일 할 경우 사람이 1인지, XOR 결과는 0입니다. 그런 다음 n 비트 그것을 부정하는 방법입니까? N 비트가 1이면, XOR의 결과가 0 인 1, 비트 n은 반대로, 0, 1, 그리고 XOR 연산 결과가 1이다. 즉,하지 않았다, 비트는 반전된다.
다음 예에서는 01110101
, 반전 비트 5 :
01110101
^ 00100000
--------
01010101
의 다른 비트 같은 경우 만 5 0은 무엇입니까?
01010101
^ 00100000
--------
01110101
드러내? XOR 두 번 수행 최신 값 계산을 반환한다. 패리티 RAID 어레이와 간단한 암호화 계산을 계산하는 데 사용되는이 아름다운 XOR 연산은 더 다른 문서를 참조하십시오.
제 우측 0 ~ 1
y = x & (x-1)
이제 마지막으로 더 흥미가 될! ! ! 다섯 가지 팁 조금 지루한 앞에 진실을 얘기합니다.
이 기술은 가장 오른쪽 1 0에 될 것입니다. 예를 들어, 지정된 정수 001,010 1 0 (가장 오른쪽 굵게 1) 결과는 00,101,000된다. 또는 00010000 0으로, 그것은 단지 하나 때문에.
다음은 몇 가지 더 예입니다 :
01010111 (x)
& 01010110 (x-1)
--------
01010110
01011000 (x)
& 01010111 (x-1)
--------
01010000
10000000 (x = -128)
& 01111111 (x-1 = 127 (with overflow))
--------
00000000
11111111 (x = all bits 1)
& 11111110 (x-1)
--------
11111110
00000000 (x = no rightmost 1-bits)
& 11111111 (x-1)
--------
00000000
왜 할 수 있습니까?
당신이 자세히 보면 위의 예제에 대해 생각한다면, 두 가지 경우가 있습니다 찾을 수 있습니다 :
- 존재의 오른쪽에 1에서 가장 비트. 이 경우, 감소는 1 비트의 값 이하가 될 것이며, (원래 값을 얻을 수 하나를 추가, 그래서 만약) 자체는 0이된다. 이 단계는 가장 오른쪽 1은 0으로 설정 한 후, 원래의 값으로 작동 될 것이다 1 우측 차단되었습니다.
- 1 (모두 0)의 존재 오른쪽 비트. 이 경우 비트 오버플 마이너스 값이 1, 0의 위상, 결과가 0 인 모든 비트를 설정한다.
제 1 절연 우측
y = x & (-x)
이 기술은 가장 오른쪽 1 찾기 위해 다른 하나는 0으로 설정됩니다. 예 : 01010100은 00000100된다.
몇 가지 예를 들면 다음과 같다 :
10111100 (x)
& 01000100 (-x)
--------
00000100
01110000 (x)
& 10010000 (-x)
--------
00010000
00000001 (x)
& 11111111 (-x)
--------
00000001
10000000 (x = -128)
& 10000000 (-x = -128)
--------
10000000
11111111 (x = all bits one)
& 00000001 (-x)
--------
00000001
00000000 (x = all bits 0, no rightmost 1-bit)
& 00000000 (-x)
--------
00000000
이 기술은 2의 보수 활용합니다. 이진 시스템을 보완 -x
동일 ~x+1
. 이제 우리는 두 가지 시나리오를 살펴 보자 :
- 가장 오른쪽 비트에 대한 B (I)의 존재하에 1이다. 우리는 모든 비트 비트 B (I-1)의 우측, B는 두 부분, B (I)으로 분할한다 (I-2), B (0), 왼쪽 비트 B (I + 1), ... , N, B ( ). 이제 계산
-x
: 먼저 B, 부정 X (i)는 0, B (I-1) , ..., B (0) (1) 및 반전 인 B (I + 1), .. ., B (N). 그런 다음 I-1, B, B, 플러스 1을 수행 (I-2), ..., B (0) 이된다 0, B (I) 1. 마지막으로, 원래의 X상은, 바이 오른쪽에있는 모든 (높은 반전) 제로, BI 남아 모든 0, 1 만 양방향이다. - 맨 오른쪽은 1 존재하지 않습니다. 값이 0, 0의 2의 보수는 여전히 0
0&0=0
어떤 비트가 1로 설정됩니다.
제 1은 우측 1 비트 뒤에있는
y = x | (x-1)
예 : 01010000은 01011111된다.
이 기술은 0이 하나되기 때문에, 완벽하지, 0 없음 1.
10111100 (x)
| 10111011 (x-1)
--------
10111111
01110111 (x)
| 01110110 (x-1)
--------
01110111
00000001 (x)
| 00000000 (x-1)
--------
00000001
10000000 (x = -128)
| 01111111 (x-1 = 127)
--------
11111111
11111111 (x = -1)
| 11111110 (x-1 = -2)
--------
11111111
00000000 (x)
| 11111111 (x-1)
--------
11111111
- (1)가 존재하지 않습니다. 이 경우에
x=0
, 및x-1
-1과 동일. 의 보수 -1 11111111, 위상은 0 또는 1의 결과를 수득한다. - 1이 존재한다. 여섯 번째 팁 참조
x-1
은 0에 1을 우측 것,이 비트와 후속 비트들은 비트 1로 설정하고, 원래 값 또는 동작이 비트는 비트 위치 1 뒤에 설정 될 경우, 이후 그렇지 않으면, 비트는 1 인 현재 0 결과는 OR 연산이었다.
9. 0 분리 된 오른쪽
y = ~x & (x+1)
이 기술과 7이 0은 우측을 발견 반대이며, 그 값을 1로 설정하고 나머지는 0으로 설정된다.
10111100 (x)
--------
01000011 (~x)
& 10111101 (x+1)
--------
00000001
01110111 (x)
--------
10001000 (~x)
& 01111000 (x+1)
--------
00001000
00000001 (x)
--------
11111110 (~x)
& 00000010 (x+1)
--------
00000010
10000000 (x = -128)
--------
01111111 (~x)
& 10000001 (x+1)
--------
00000001
11111111 (x = no rightmost 0-bit)
--------
00000000 (~x)
& 00000000 (x+1)
--------
00000000
00000000 (x)
--------
11111111 (~x)
& 00000001 (x+1)
--------
00000001
증명 : 0 오른쪽이 가정합니다. ~x
가장 오른쪽 0 1 설정, x+1
너무. 그런 다음 ~x
과 x+1
위상, 비트보다 높은은 (반전되므로, 하이 변경 및 동작 높은 X + 1을 수정하지 않음)를 0으로 설정되고, 비트 0 X + 1 개보다 조금 낮은 설정한다 하부의 상 비율이 0으로 설정되도록,이 비트는 1로 설정된다.
0 내지 1의 제 우측
y = x | (x+1)
예 : 1010 0011 10100111된다.
10111100 (x)
| 10111101 (x+1)
--------
10111101
01110111 (x)
| 01111000 (x+1)
--------
01111111
00000001 (x)
| 00000010 (x+1)
--------
00000011
10000000 (x = -128)
| 10000001 (x+1)
--------
10000001
11111111 (x = no rightmost 0-bit)
| 00000000 (x+1)
--------
11111111
00000000 (x)
| 00000001 (x+1)
--------
00000001
증명 : x와 X + 1 상 또는 전혀 정보가 손실됩니다. 0 X + 1 그래서 가장 오른쪽 1가되도록, 결과는 우측 0 0 오른쪽이다. 또는 두 단계의 결과 max{x, x+1}
, 상기 우측 X + 1 1 0으로 설정된다.