> b" 처리는 먼저 b mod 32||64 연산을 수행합니다. a가 int 유형이면 mod 32를 사용하고, a가 double 유형이면 mod 64를 취하고 Shift는 다음과 같습니다. 위에서 언급한 일반적인 시프트 산술 규칙을 사용하여 수행됩니다."/> > b" 처리는 먼저 b mod 32||64 연산을 수행합니다. a가 int 유형이면 mod 32를 사용하고, a가 double 유형이면 mod 64를 취하고 Shift는 다음과 같습니다. 위에서 언급한 일반적인 시프트 산술 규칙을 사용하여 수행됩니다.">

 >  기사  >  Java  >  Java의 영리한 변위 연산 방법

Java의 영리한 변위 연산 방법

高洛峰
高洛峰원래의
2016-12-16 17:05:551544검색

왼쪽 시프트 연산: 컴파일러 실행 단계:

1) x가 byte, short, char 유형인 경우 x를 int로 승격합니다.

2) x가 byte 유형인 경우, short, char, int , n이 재할당됩니다(프로세스는 n의 보수의 하위 5비트를 가져와 이를 10진수 int 값으로 변환합니다. 이는 n 모듈로 32를 취하는 것과 같습니다: n=n%32).

x가 long 유형인 경우 n이 다시 할당됩니다(프로세스는 n 보수의 하위 6비트를 가져와 이를 10진수 int 값으로 변환합니다. 이는 n 모듈로 64를 취하는 것과 동일합니다. n=n %64);

( int 유형이 4바이트, 즉 32비트이므로 32비트를 이동하는 것은 의미가 없습니다. 오랫동안 모듈로 64)

3) Shift x를 n자리만큼 왼쪽으로 이동하면 전체 표현식이 새 값을 생성합니다(x 값은 변경되지 않음).

26ff06e72a50d762ddacec1496bc1f7d> x>>1은 부호 비트가 없는 오른쪽 시프트 기호입니다.

>> >1은 변경 내용을 의미)

보충 지침:

Java 코드

출력

1 2 4 8 16 32 64 128

// 左移: 向左移动,右边补0   
for (int i = 0;i < 8 ;i++)   
System.out.print( (1 << i) + " ");

출력

40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000

// 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1   
// 符号位为1的右移   
for (int i = 0;i < 8 ;i++)   
System.out.print( Integer.toHexString(0x40000000 >> i) + " ");

출력

800000 00 c0000000 e0000000 f0000000 f8000000 fc000000 fe000000 ff000000

 // 符号位为1的右移   
// 最高4位为1000, 右移1位,变成1100也就是c,   
for (int i = 0;i < 8 ;i++)   
System.out.print( Integer.toHexString(0x80000000 >> i) + " ");
위의 일반 규칙은 틀린 것은 아니지만, int형의 경우 쉬프트 자릿수는 32자를 넘지 않고, long형의 경우 쉬프트 자릿수는 64자를 넘지 못한다. 이제 다음 테스트를 수행합니다.

Java 코드

0x80000000. 31비트를 오른쪽으로 이동한 후 각 비트는 1(즉, -1)이 됩니다. 오른쪽으로 이동 물론 32비트는 여전히 -1이지만 32비트를 오른쪽으로 이동한 후에 결과는 숫자 자체입니다.

int 및 long 유형 데이터의 왼쪽 및 오른쪽 시프트를 테스트하여 다음을 발견했습니다.

System.out.println(Integer.toHexString(0x80000000 >> 31));   
// output: ffffffff   
System.out.println(Integer.toHexString(0x80000000 >> 32));   
// output: 80000000
Java는 시프트 연산 "a d97d3819c7ea187b03d9b2a6e554e3c4> b"를 먼저 처리합니다. b mod 32||64 연산, a가 int 유형인 경우 mod 32를 취하고, a가 double 유형인 경우 mod 64를 선택한 다음 위에서 언급한 일반적인 시프트 연산 규칙을 ​​사용하여 시프트합니다.

이 시점에서 BitSet 클래스에

문이 있는 이유를 이해할 수 있습니다. jdk에 익숙한 프로그래머는 1L << % 64) jdk에는 중복됩니다.

1L << bitIndex

Java의 영리한 치환 연산 방법에 대한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:JAVA 시프트 연산자다음 기사:JAVA 시프트 연산자