Java에서 시프트 연산자는 어떻게 작동합니까?
저는 시프트 오퍼레이터를 이해하려고 노력하고 있으며, 많은 것을 얻을 수 없었습니다.아래 코드를 실행하려고 했을 때
System.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));
이하를 알 수 있습니다.
1000000000000
100000000000000000000000
100
10000000000000
1000000000000000000000000
누가 설명 좀 해주시겠어요?
System.out.println(Integer.toBinaryString(2 << 11));
2 (2진수)를.10
11시 정각시 : 이때에 hence,1000000000000
System.out.println(Integer.toBinaryString(2 << 22));
2 (2진수)를.10
22살이에요. : 그문 、100000000000000000000000
System.out.println(Integer.toBinaryString(2 << 33));
인트 4번, 32번따라서 33만큼 이동하면 1만큼 이동되는 것과 같습니다. : 그문 、100
2진법에서의 10진법 번호 체계로부터의 2는 다음과 같다.
10
그렇다면
2 << 11
오른쪽에는 11개의 0이 패딩되어 있습니다.
1000000000000
서명된 왼쪽 시프트 연산자 "<"는 비트 패턴을 왼쪽으로 이동하고 서명된 오른쪽 시프트 연산자 ">"는 비트 패턴을 오른쪽으로 이동합니다.비트 패턴은 왼쪽 피연산자에 의해 지정되며, 오른쪽 피연산자에 의해 이동되는 위치 수는 오른쪽 피연산자에 의해 지정됩니다.부호 없는 오른쪽 시프트 연산자 ">>"는 0을 맨 왼쪽 위치로 이동하고 ">" 뒤의 왼쪽 위치는 기호 확장자 [..]에 의존합니다.
왼쪽 이동 결과에서 2(*2)의 곱셈(항 또는 산술)이 발생합니다.
예를들면
2의 2분의 110
'어울리다'라고 해요<<1
,이 .100
, 「」입니다.4
4의 4100
'어울리다'라고 해요<<1
,이 .1000
, 「」입니다.8
기타 항목
오른쪽 시프트와 왼쪽 시프트가 같은 방법으로 동작하는 방법에 대해 설명합니다.올바른 전환:오른쪽 시프트 연산자 >>는 값의 모든 비트를 지정된 횟수만큼 오른쪽으로 이동합니다.일반적인 형태:
value >> num
여기서 num은 값에서 값을 오른쪽 이동할 위치 수를 지정합니다.즉, >>는 지정된 값의 모든 비트를 num으로 지정된 비트 위치 수의 오른쪽으로 이동합니다.다음 코드 프래그먼트는 값 32를 오른쪽으로 2개씩 이동시켜 a를 8로 설정합니다.
int a = 32;
a = a >> 2; // a now contains 8
값에 "shift off" 비트가 있으면 해당 비트는 손실됩니다.예를 들면, 다음의 코드 프래그먼트는, 값 35를 오른쪽의 2개의 위치로 이동시켜, 2개의 하위 비트를 소실시켜, 다시 a를 8로 설정한다.
int a = 35;
a = a >> 2; // a still contains 8
같은 연산을 바이너리로 보면, 이러한 현상이 어떻게 발생하는지를 보다 명확하게 알 수 있습니다.
00100011 35 >> 2
00001000 8
값을 오른쪽으로 이동할 때마다 해당 값이 2로 분할되고 나머지 값은 삭제됩니다.고성능 정수를 2로 나누면 이 점을 활용할 수 있습니다.물론 올바른 방향으로 비트를 옮기지 않도록 해야 합니다.오른쪽으로 이동하면 오른쪽 이동에 의해 노출된 상단(맨 왼쪽) 비트가 상단 비트의 이전 내용으로 채워집니다.이것은 부호 확장이라고 불리며 음수 기호를 오른쪽으로 이동할 때 이를 보존하는 역할을 합니다.를 들어, 「」라고 하는 것은,–8 >> 1
–4
2진수입니다
11111000 –8 >>1
11111100 –4
흥미로운 점은 부호 확장이 상위 비트에 계속 추가되기 때문에 -1을 오른쪽으로 이동하면 결과는 항상 -1로 유지된다는 것입니다.값을 오른쪽으로 이동할 때 확장 부호를 사용하는 것이 바람직하지 않을 수 있습니다.예를 들어, 다음 프로그램은 바이트 값을 16진수 문자열로 변환합니다.시프트 값은 0x0f로 AND 처리하여 마스킹되고 부호 확장 비트는 폐기되므로 값이 16진수 문자 배열의 인덱스로 사용할 수 있습니다.
// Masking sign extension.
class HexByte {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
이 프로그램의 출력은 다음과 같습니다.
b = 0xf1
도움이 될 것 같습니다.
System.out.println(Integer.toBinaryString(2 << 0));
System.out.println(Integer.toBinaryString(2 << 1));
System.out.println(Integer.toBinaryString(2 << 2));
System.out.println(Integer.toBinaryString(2 << 3));
System.out.println(Integer.toBinaryString(2 << 4));
System.out.println(Integer.toBinaryString(2 << 5));
결과
10
100
1000
10000
100000
1000000
편집 완료:
이 정보를 꼭 읽어야 합니다(비트 단위 이동 연산자 작업 방법)
예를 들어 다음과 같습니다.
- 서명된 좌측 시프트
[ 2 < 1 ]는 => [10(2의 제곱)은 이진 문자열 끝에 1의 0을 더합니다]따라서 10은 100이 되고 4가 됩니다.
부호 있는 왼쪽 시프트는 곱셈을 사용합니다...따라서 이 값은 2 * (2^1) = 4. 다른 예 [2 < 11] = 2 * (2^11) = 4096으로 계산할 수 있습니다.
- 서명된 우측 시프트
[ 4 > > 1 ]는 => [100(4의 제곱) 바이너리 문자열 끝에 있는1개의 0을 삭제합니다]따라서 100은 10이 되고 2가 됩니다.
서명된 오른쪽 시프트는 나눗셈을 사용합니다...따라서 이 값은 4 / (2^1) = 2 다른 예 [4096 >> 11] = 4096 / (2^11) = 2로 계산할 수도 있습니다.
수의 시킵니다.0's
.
ex의 경우
10
가 'Digit'입니까?2
는 '2'입니다.1000
가 'Digit'입니까?8
10
가 'Digit'입니까?2
은 '3'이다.10000
어느 것이 숫자입니까?16
시프트는 데이터 유형(char, int 및 long int)을 사용하여 구현할 수 있습니다.부동 및 이중 데이터는 이동되지 않습니다.
value= value >> steps // Right shift, signed data.
value= value << steps // Left shift, signed data.
서명된 왼쪽 시프트 논리적으로 심플한 경우 1 < 11 이면 2048 및 2 이 됩니다.< 11 이면 4096 이 됩니다.
자바 프로그래밍에서 a = 2 < 11;
// it will result in 4096
2<<11 = 2*(2^11) = 4096
변수를 이동하고 변수에 다시 할당하는 일반적인 방법은 속기 연산자 <<=, >= 또는 >=로 고쳐 쓸 수 있습니다.이러한 연산자는 사양에서는 복합 할당 연산자로도 알려져 있습니다.
예를들면,
i >>= 2
과 같은 결과를 낳다
i = i >> 2
언급URL : https://stackoverflow.com/questions/10910913/how-do-shift-operators-work-in-java
'programing' 카테고리의 다른 글
플렉스-컬럼을 사용하여 다른 항목을 고정하는 동안 하나의 플렉스박스 항목만 스크롤 (0) | 2022.08.29 |
---|---|
문자 포인터가 int*에서 캐스트된 후 유효하지 않은 값을 가리키고 있습니다. (0) | 2022.08.29 |
매퍼를 사용한 양방향 바인딩 계산 속성 (0) | 2022.08.28 |
여러 Vue 애플리케이션, 단일 구성 요소 공유 (0) | 2022.08.28 |
C에서 WinRT를 사용하시겠습니까? (0) | 2022.08.28 |