문제

나는 단지 재미로 코드를 작성하는 사람이고 학술적이거나 전문적인 환경에서 코드를 깊이 탐구해 본 적이 없기 때문에 이러한 비트 연산자와 같은 내용은 정말 이해하기 어렵습니다.

비트 연산을 지원하는 것으로 보이는 JavaScript에 관한 기사를 읽고 있었습니다.이 작업이 여러 곳에서 계속 언급되는 것을 보고, 그것이 정확히 무엇인지 알아보기 위해 관련 내용을 읽어보았지만 전혀 이해하지 못하는 것 같습니다.그럼 그들은 무엇입니까?명확한 예가 좋을 것입니다!:디

몇 가지 질문만 더 드리겠습니다. 비트 연산의 실제 적용 사례는 무엇입니까?언제 사용할 수 있나요?

도움이 되었습니까?

해결책

아무도 이것이 유용한 이유의 주제를 깨뜨리지 않았기 때문에 다음과 같습니다.

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

 Read: 00000001
Write: 00000010

따라서 읽기와 쓰기를 통과하려면 두 가지를 결합한 (읽기 | 쓰기)

00000011

그런 다음 다른 쪽 끝에 암호 해독 될 수 있습니다.

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

어떤 확인

00000011 &
00000001

반환

00000001

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

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

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

이 경우 왼쪽으로 꺼지고 오른쪽으로 켜지는 (왼쪽 | 오른쪽)로 현재 값을 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. 따라서 본질적으로 빨간색의 경우 다음을 수행 할 것입니다.

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)

다른 팁

다른 답변으로 나열된 단일 비트 진실 테이블은 한 번에 하나 또는 두 개의 입력 비트에서만 작동한다는 점은 주목할 가치가 있습니다. 다음과 같은 정수를 사용할 때 발생하는 일

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

각 열에있는 각 열의 각 비트 쌍은 "및"기능을 통해 실행되며 결론에 해당 출력 비트를 제공합니다. 따라서 위의 표현식에 대한 답은 4입니다. CPU는 (이 예에서) 8 개별 "및"각 열마다 하나씩 동작을 수행했습니다.

나는 아직도이 "아하"를 기억하기 때문에 이것을 언급합니다. 몇 년 전에 이것에 대해 배웠던 순간.

Bitwise Operator는 한 번에 조금씩 작동하는 운영자입니다.

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

또는 입력 중 하나 이상이 1 인 경우 1입니다.

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

입력이 0 인 경우에만 1이 아닙니다.

이것들은 진실 테이블로 가장 잘 설명 될 수 있습니다. 입력 가능성은 상단과 왼쪽에 있으며, 결과 비트는 두 입력의 교차점에서 표시된 4 개 중 하나입니다 (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 (Binary 1111) : :

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

이들은 모두 JavaScript에서 지원되는 Bitwise 연산자입니다.

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

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

  • op1 ^ op2 - EXCLUSIVE-OR 연산자는 두 비트를 비교하고 1 비트 중 하나가 1 인 경우 1이고 두 비트가 모두 0 또는 1 인 경우 0을 제공합니다.

  • ~op1 - COMPLEMENT 연산자는 피연산자의 모든 비트를 뒤집는 데 사용됩니다.

  • op1 << op2 - SHIFT LEFT 연산자는 비트를 왼쪽으로 이동하고, 왼쪽 비트를 버리고, 오른쪽 비트를 0의 0을 할당합니다.

  • op1 >> op2 - SHIFT RIGHT 연산자는 비트를 오른쪽으로 움직이고, 오른쪽 비트를 버리고, 가장 왼쪽 비트를 0의 값을 할당합니다. 오른쪽으로 이동하면 OP1을 효과적으로 나눕니다. 가장 왼쪽 부호 비트가 보존됩니다.

  • op1 >>> op2 - SHIFT RIGHT - ZERO FILL 연산자는 비트를 오른쪽으로 움직이고, 오른쪽 비트를 버리고, 가장 왼쪽 비트를 0의 값을 할당합니다. 오른쪽으로 이동하면 OP1을 효과적으로 나눕니다. 가장 왼쪽 부호 비트는 폐기됩니다.

조금 더 분류하기 위해서는 해당 값의 이진 표현과 관련이 있습니다.

For example (in decimal):
x = 8
y = 1

would come out to (in binary):
x = 1000
y = 0001

From there, you can do computational operations such as 'and' or 'or'; in this case:
x | y = 
1000 
0001 |
------
1001

or...9 in decimal

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

"Bitwise"라는 용어가 언급되면 때때로 "논리적"연산자가 아닌 것이 명확 해집니다.

예를 들어 JavaScript에서 Bitwise Operators는 자신의 피연산자를 32 비트 (0)의 시퀀스로 취급합니다.; 그 동안에, 논리 연산자는 일반적으로 부울 (논리적) 값으로 사용됩니다. 그러나 부울이 아닌 유형으로 작동 할 수 있습니다.

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

거짓으로 변환 할 수있는 경우 expr1을 반환합니다. 그렇지 않으면 expr2를 반환합니다. 따라서 부울 값과 함께 사용될 때 && 두 피연산자가 모두 참이면 TRUE를 반환합니다. 그렇지 않으면 거짓을 반환합니다.

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

다른 사람들이 지적했듯이, 2와 4는 약간이므로 0이되므로 0이되게됩니다.

다음을 test.html 또는 무언가에 복사하고 테스트 할 수 있습니다.

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

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

운영:

  • 비트 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의 곱셈 및 나눗셈과 동일합니다.와이 각기.

예.

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
  • 빠른 최소 x와 y없이 찾으십시오 if else 진술

예.

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 숫자에서만 작동합니다.

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

이런 식으로 생각하는 것이 도움이 될 수 있습니다. 이것은 방법과 (&)가 작동합니다.

기본적 으로이 숫자 모두 중 하나라고 말하기 때문에 두 숫자 5와 3이 있으면 이진으로 변환되고 컴퓨터는 생각할 것입니다.

         5: 00000101
         3: 00000011

둘 다 하나입니다 : 00000001 0은 거짓이고 1은 참입니다.

따라서 5와 3은 하나입니다. OR (|) 연산자는 숫자 중 하나만이 하나만 출력 해야하는 것을 제외하고는 동일한 작업을 수행합니다.

나는 JavaScript 비트 연산자가 얼마나 느린 지에 대해 계속 들었습니다. 나는 약간의 시험을했다 내 최신 블로그 게시물 그리고 여러 테스트에서 산술 대안보다 40% ~ 80% 빠른 것으로 나타났습니다. 아마도 그들은 느 렸을 것입니다. 현대식 브라우저에서 나는 그들을 사랑합니다.

내 코드에는이 때문에 더 빠르고 읽기 쉬운 사례가 하나 있습니다. 더 많은 것을 위해 눈을 뜨게 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top