나는 재미를 위해 코드를 작성하고 학문적 또는 전문적인 환경에서 실제로 코드를 탐구하지 않은 사람이므로 이러한 비트 연산자와 같은 것들이 실제로 나를 피합니다.
비트 단위 연산을 지원하는 JavaScript에 대한 기사를 읽었습니다. 나는이 작업이 장소에서 언급 된 것을 계속보고 있으며 그것이 정확히 무엇인지 알아 내려고 노력했지만 전혀 이해하지 못하는 것 같습니다. 그래서 그들은 무엇입니까? 명확한 예가 좋을 것입니다! :디
몇 가지 질문이 더 있습니다. 비트 단위 연산의 실제 적용은 무엇입니까? 언제 사용할 수 있습니까?
답변
아무도 왜 이것이 유용한 지에 대한 주제를 밝히지 않았습니다.
플래그로 작업 할 때 비트 연산을 많이 사용합니다. 예를 들어, 일련의 플래그를 작업에 전달하려는 경우 (예 : 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)
답변
다른 답변으로 나열된 단일 비트 진리표는 한 번에 하나 또는 두 개의 입력 비트에서만 작동한다는 점은 주목할 가치가 있습니다. 다음과 같은 정수를 사용하면 어떻게됩니까?
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!”가 있다는 것을 기억하기 때문에 이것을 언급합니다. 몇 년 전에 내가 알게 된 순간.
답변
비트 연산자는 한 번에 조금씩 작동하는 연산자입니다.
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
답변
다음은 비트 연산자이며 모두 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 비트. 가장 왼쪽의 부호 비트는 폐기됩니다.
답변
조금 더 세분화하려면 해당 값의 이진 표현과 관련이 있습니다.
예를 들어 (10 진수) : x = 8 y = 1 이진으로 나올 것입니다 : x = 1000 y = 0001 여기에서 'and'또는 'or'와 같은 계산 작업을 수행 할 수 있습니다. 이 경우 : x | y = 1000 0001 | ------ 1001 또는 ... 9 진수
도움이 되었기를 바랍니다.
답변
“비트 단위”라는 용어가 언급 될 때, 때때로 “논리적”연산자가 아님을 분명히합니다.
예를 들어 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>
답변
디지털 컴퓨터 프로그래밍에서, 비트 단위 연산은 개별 비트 레벨에서 하나 이상의 비트 패턴 또는 이진수에 대해 동작한다. 프로세서가 직접 지원하는 빠르고 원시적 인 조치이며 비교 및 계산을 위해 값을 조작하는 데 사용됩니다.
작업 :
-
비트 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 번호에서만 작동합니다
또한 비트 단위 논리의 광범위한 사용이 있습니다