당신은 기본 비트 컴퓨팅 기술을 알고있다 (압력 DP 등을 검색 엔진 최적화가 사용됩니다)


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 단계의 개수는, 결과가 짝수가 0이고, 결과는 홀수이다 정수를 결정하는 홀수 또는 짝수이다.

    N 비트의 여부를 판정하는 것은 1 : X는 (1 << n)의 결과는 하나, 기재되어 있지 않다 0이다.

    n 번째 비트는 1로 설정된다 : Y = X의 | (1 << N)

    N은 제 세트 0 : Y = X의 & ~ (1 << n)의

    비트 (n)의 역수 값 : Y = X ^ (1 << n)의

    가장 오른쪽 1 내지 0 : Y = (X) 및 (X-1)

    격리 우측 1 : Y = X의 및 (-x)

    1가 1 비트 우측 뒤에 위치 : Y = X의 | (X-1)

    격리 우측 0 ~ Y = (X) 및 (X + 1)

    가장 오른쪽 0~1 : Y = X의 | (X + 1)

    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에서 가장 비트. 이 경우, 감소는 1 비트의 값 이하가 될 것이며, (원래 값을 얻을 수 하나를 추가, 그래서 만약) 자체는 0이된다. 이 단계는 가장 오른쪽 1은 0으로 설정 한 후, 원래의 값으로 작동 될 것이다 1 우측 차단되었습니다.
    2. 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. 이제 우리는 두 가지 시나리오를 살펴 보자 :

    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 만 양방향이다.
    2. 맨 오른쪽은 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. (1)가 존재하지 않습니다. 이 경우에 x=0, 및 x-1-1과 동일. 의 보수 -1 11111111, 위상은 0 또는 1의 결과를 수득한다.
    2. 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너무. 그런 다음 ~xx+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으로 설정된다.

    추천

    출처www.cnblogs.com/jiangxin/p/11796707.html