비트 연산자 란 무엇입니까?


130

나는 재미를 위해 코드를 작성하고 학문적 또는 전문적인 환경에서 실제로 코드를 탐구하지 않은 사람이므로 이러한 비트 연산자와 같은 것들이 실제로 나를 피합니다.

비트 단위 연산을 지원하는 JavaScript에 대한 기사를 읽었습니다. 나는이 작업이 장소에서 언급 된 것을 계속보고 있으며 그것이 정확히 무엇인지 알아 내려고 노력했지만 전혀 이해하지 못하는 것 같습니다. 그래서 그들은 무엇입니까? 명확한 예가 좋을 것입니다! :디

몇 가지 질문이 더 있습니다. 비트 단위 연산의 실제 적용은 무엇입니까? 언제 사용할 수 있습니까?


2
추가 질문이있는 경우 새 SO 질문을 추가하고이 질문을 참조 할 수 있습니다. 그런 식으로 더 나은 답변을 얻을 수 있습니다.
Greg Hewgill

답변:


187

아무도 왜 이것이 유용한 지에 대한 주제를 밝히지 않았습니다.

플래그로 작업 할 때 비트 연산을 많이 사용합니다. 예를 들어, 일련의 플래그를 작업에 전달하려는 경우 (예 : File.Open()읽기 모드와 쓰기 모드가 모두 활성화 된 경우) 단일 값으로 전달할 수 있습니다. 이는 가능한 각 플래그를 비트 세트 (바이트, short, int 또는 long)로 자체 비트를 할당하여 수행됩니다. 예를 들면 다음과 같습니다.

 Read: 00000001
Write: 00000010

따라서 읽기 및 쓰기를 전달하려면 (READ | WRITE)를 전달한 다음 두 가지를 결합합니다.

00000011

그런 다음 다른 쪽 끝에서 해독 할 수 있습니다.

if ((flag & Read) != 0) { //...

어떤 검사

00000011 &
00000001

어떤 반환

00000001

0이 아니므로 플래그는 READ를 지정합니다.

XOR을 사용하여 다양한 비트를 토글 할 수 있습니다. 플래그를 사용하여 방향 입력 (위, 아래, 왼쪽, 오른쪽)을 지정할 때 이것을 사용했습니다. 예를 들어 스프라이트가 가로로 움직이고 있고 돌아 서고 싶은 경우 :

     Up: 00000001
   Down: 00000010
   Left: 00000100
  Right: 00001000
Current: 00000100

이 경우에는 LEFT를 끄고 오른쪽으로 켜는 (LEFT | RIGHT)로 현재 값을 XOR합니다.

비트 이동은 여러 경우에 유용합니다.

x << y

와 같다

x * 2

2의 거듭 제곱을 빠르게 곱해야하지만 1 비트를 최상위 비트로 이동하는 것을 조심해야한다면 부호가없는 한 숫자를 음수로 만듭니다. 다른 크기의 데이터를 처리 할 때도 유용합니다. 예를 들어, 4 바이트에서 정수를 읽는 경우 :

int val = (A << 24) | (B << 16) | (C << 8) | D;

A가 가장 중요한 바이트이고 D가 가장 작은 것으로 가정합니다. 결과는 다음과 같습니다.

A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011

색상은 종종 이런 식으로 저장됩니다 (가장 중요한 바이트는 무시되거나 알파로 사용됨).

A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000

값을 다시 찾으려면 맨 아래에 올 때까지 비트를 오른쪽으로 이동 한 다음 나머지 상위 비트를 마스킹하십시오.

Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF

0xFF와 동일합니다 11111111. 본질적으로 Red의 경우 다음을 수행합니다.

Color >> 16 = (filled in 00000000 00000000)11111111 00010101  (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)

x << n이므로 n은 2 ^ value 형식이어야합니다.
아메드 C

28

다른 답변으로 나열된 단일 비트 진리표는 한 번에 하나 또는 두 개의 입력 비트에서만 작동한다는 점은 주목할 가치가 있습니다. 다음과 같은 정수를 사용하면 어떻게됩니까?

int x = 5 & 6;

답은 각 입력의 이진 확장에 있습니다.

  5 = 0 0 0 0 0 1 0 1
& 6 = 0 0 0 0 0 1 1 0
---------------------
      0 0 0 0 0 1 0 0

각 열의 각 비트 쌍은 "AND"기능을 통해 실행되어 맨 아래 줄에 해당 출력 비트를 제공합니다. 따라서 위의 표현에 대한 답은 4입니다. CPU는이 열에서 8 개의 개별 "AND"연산을 각 열에 대해 하나씩 병렬로 수행했습니다.

나는 아직도이 "AHA!"가 있다는 것을 기억하기 때문에 이것을 언급합니다. 몇 년 전에 내가 알게 된 순간.


와우, 이제 훨씬 더 의미가 있습니다. 외관상으로는 훨씬 더 복잡하게 들렸다. 감사. 나는 좋은 사람의 하중이 있기 때문에 정답으로 선택하고, 내가 upvote에 너무 .. 감사 할 수없는 모르겠어요
클릭

27

비트 연산자는 한 번에 조금씩 작동하는 연산자입니다.

AND는 두 입력이 모두 1 인 경우에만 1입니다.

하나 이상의 입력이 1이면 OR은 1입니다.

XOR은 입력 중 하나가 정확히 1 인 경우에만 1입니다.

NOT은 입력이 0 인 경우에만 1입니다.

이들은 진리표로 가장 잘 설명 될 수 있습니다. 입력 가능성은 상단과 왼쪽에 있으며 결과 비트는 두 입력의 교차점에 표시된 4 개의 값 중 하나입니다 (1 개의 입력 만 있기 때문에 NOT의 경우 2).

AND|0 1      OR|0 1
---+----    ---+----
  0|0 0       0|0 1
  1|0 1       1|1 1

XOR|0 1     NOT|0 1
---+----    ---+---
  0|0 1        |1 0
  1|1 0

예를 들어 정수의 하위 4 비트 만 원한다면 15 (2 진 1111)로 AND를 계산하면됩니다.

    203: 1100 1011
AND  15: 0000 1111
------------------
 IS  11: 0000 1011

16

다음은 비트 연산자이며 모두 JavaScript로 지원됩니다.

  • op1 & op2- AND연산자는 두 비트를 비교하고 두 비트가 모두 1 인 경우 1의 결과를 생성합니다. 그렇지 않으면 0을 반환합니다.

  • op1 | op2- OR비트가 상보적인 경우 연산자는 두 비트를 비교하고 1의 결과를 생성합니다. 그렇지 않으면 0을 반환합니다.

  • op1 ^ op2- EXCLUSIVE-OR연산자는 두 비트를 비교하고 비트 중 하나가 1이면 1을 반환하고 두 비트가 모두 0 또는 1이면 0을 반환합니다.

  • ~op1- COMPLEMENT연산자는 피연산자의 모든 비트를 반전시키는 데 사용됩니다.

  • op1 << op2- SHIFT LEFT연산자는 비트를 왼쪽으로 이동하고 맨 왼쪽 비트를 버리고 가장 오른쪽 비트에 0 값을 할당합니다. 왼쪽으로 이동할 때마다 op1에 2가 곱해집니다.

  • op1 >> op2- SHIFT RIGHT연산자는 비트를 오른쪽으로 이동하고 맨 오른쪽 비트를 버리고 가장 왼쪽 비트에 0 값을 할당합니다. 오른쪽으로 이동할 때마다 op1을 절반으로 효과적으로 나눕니다. 가장 왼쪽의 부호 비트가 유지됩니다.

  • op1 >>> op2- SHIFT RIGHT- ZERO FILL오퍼레이터가 오른쪽 비트 이동 폐기 오른쪽 비트 및 양수인 가장 왼쪽 오른쪽 효과적으로 분할하는 각 이동이 반 OP1 값 0 비트. 가장 왼쪽의 부호 비트는 폐기됩니다.


"비트가 상호 보완 적이라면"
안드레이 Tyukin

@AndreyTyukin 두 비트 중 하나는 1이고 다른 하나는 0이면 상보 적입니다.
Jeff Hillman

@JeffHillman 코멘트의 설명에 따르면, 1과 1은 "상보 적"이 아닙니다. 왜 그럼 나에게 불분명 1 | 1제공 1하지 0, 방법은 |다음과 다를 수로되어있다 ^. 며칠 전에이 Q / A를 복제 대상으로 사용해야했으며 10 년 후에는 이런 종류의 질문에 대해 명확한 표준 복제본을 가지기를 원했습니다.
Andrey Tyukin

4

조금 더 세분화하려면 해당 값의 이진 표현과 관련이 있습니다.

예를 들어 (10 진수) :
x = 8
y = 1

이진으로 나올 것입니다 :
x = 1000
y = 0001

여기에서 'and'또는 'or'와 같은 계산 작업을 수행 할 수 있습니다. 이 경우 :
x | y =
1000 
0001 |
------
1001

또는 ... 9 진수

도움이 되었기를 바랍니다.


|OR 작업입니까?
Si8

어떤 이유로 이것이 가장 의미가 있습니다. 그래도 그 x | y = 1000 0001 |부분 에 대해 확실하지 않은
samayo

4

"비트 단위"라는 용어가 언급 될 때, 때때로 "논리적"연산자가 아님을 분명히합니다.

예를 들어 JavaScript에서 비트 연산자는 피연산자를 32 비트 (0과 1)의 시퀀스로 취급합니다 . 한편, 논리 연산자는 일반적으로 부울 (논리) 값과 함께 사용 되지만 부울이 아닌 유형에서 작동 할 수 있습니다.

예를 들어 expr1 && expr2를 사용하십시오.

expr1을 false로 변환 할 수 있으면이를 리턴합니다. 그렇지 않으면 expr2를 반환합니다. 따라서 부울 값과 함께 사용하면 두 피연산자가 모두 true 인 경우 &&는 true를 리턴합니다. 그렇지 않으면 false를 반환합니다.

a = "Cat" && "Dog"     // t && t returns Dog
a = 2 && 4     // t && t returns 4

다른 사람들이 지적했듯이 2 & 4는 비트 AND이므로 0을 반환합니다.

다음을 test.html 또는 다른 것으로 복사하여 테스트 할 수 있습니다.

<html>
<body>
<script>
    alert("\"Cat\" && \"Dog\" = " + ("Cat" && "Dog") + "\n"
        + "2 && 4 = " + (2 && 4) + "\n"
        + "2 & 4 = " + (2 & 4));
</script>

3

디지털 컴퓨터 프로그래밍에서, 비트 단위 연산은 개별 비트 레벨에서 하나 이상의 비트 패턴 또는 이진수에 대해 동작한다. 프로세서가 직접 지원하는 빠르고 원시적 인 조치이며 비교 및 ​​계산을 위해 값을 조작하는 데 사용됩니다.

작업 :

  • 비트 AND

  • 비트 OR

  • 비트 NOT

  • 비트 XOR

  • 기타

아이템 목록

    AND|0 1        OR|0 1 
    ---+----      ---+---- 
      0|0 0         0|0 1 
      1|0 1         1|1 1 

   XOR|0 1        NOT|0 1 
   ---+----       ---+--- 
     0|0 1           |1 0 
     1|1 0

예 :

    203: 1100 1011
AND  15: 0000 1111
------------------
  =  11: 0000 1011

비트 연산자 사용

  • 왼쪽 시프트 및 오른쪽 시프트 연산자는 각각 x * 2 y 로 곱셈 및 나눗셈과 같습니다 .

예 :

int main()
{
     int x = 19;
     printf ("x << 1 = %d\n" , x <<1);
     printf ("x >> 1 = %d\n", x >>1);
     return 0;
}
// Output: 38 9
  • & 연산자를 사용하면 숫자가 홀수인지 짝수인지 빠르게 확인할 수 있습니다.

예 :

int main()
{
    int x = 19;
    (x & 1)? printf("Odd"): printf("Even");
    return 0;
 }
// Output: Odd
  • if else진술 없이 x와 y의 빠른 찾기

예 :

int min(int x, int y)
{
    return y ^ ((x ^ y) & - (x < y))
}
  • 10 진수를 이진수로 변환

예 :

#include <stdio.h>
int main ()
{
    int n , c , k ;
    printf("Enter an integer in decimal number system\n " ) ;
    scanf( "%d" , & n );
    printf("%d in binary number
    system is: \n " , n ) ;
    for ( c = 31; c >= 0 ; c -- )
    {
         k = n >> c ;
         if ( k & 1 )
              printf("1" ) ;
         else
              printf("0" ) ;
      }
      printf(" \n " );
      return 0 ;
}
  • XOR 게이트 암호화는 프로그래머의 호환성과 양립성으로 인해 널리 사용되는 기술입니다.
  • 비트 XOR 연산자는 기술 인터뷰 관점에서 가장 유용한 연산자입니다.

비트 시프트는 + ve 번호에서만 작동합니다

또한 비트 단위 논리의 광범위한 사용이 있습니다


"complixblity and reare ..."?
Jonathan Cross

The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.맞습니다! muyiy.cn/question/program/102.html
xgqfrms 1


1

이런 식으로 생각하면 도움이 될 수 있습니다. AND (&)의 작동 방식은 다음과 같습니다.

기본적 으로이 숫자는 모두 숫자이므로 5와 3의 두 숫자가 있으면 이진수로 변환되고 컴퓨터는

         5: 00000101
         3: 00000011

00000001 0은 거짓, 1은 참

따라서 5와 3의 AND는 하나입니다. OR (|) 연산자는 숫자 중 하나만 1을 출력해야하며 둘 다가 아닌 1이어야한다는 점을 제외하고 동일한 작업을 수행합니다.


-5

JavaScript 비트 연산자가 얼마나 느린 지 계속 들었습니다. 최신 블로그 게시물을 테스트 했습니다. 그들은 빠른 몇 가지 테스트에서 연산 다른 80 % 이상 40 %였다 발견. 아마도 그들은 느려졌을 것입니다. 현대 브라우저에서 나는 그들을 좋아합니다.

이로 인해 코드에 더 빠르고 읽기 쉬운 사례가 하나 있습니다. 더 눈을 뜨고있을 게요

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.