2017-11-09 9 views
2

저는 비트 연산자를 가지고 놀고 싶었고 순환 비트 시프트를 만들고 싶었습니다.Java 비트 순환 시프트가 작동하지 않습니다.

//Circular right shift 
private static void testCircular() { 
    int x = 37; 
    System.out.println(x + " Is " + Integer.toBinaryString(x)); 

    x = (x >>> 8) | (x << (Integer.SIZE - 8)); 

    System.out.println(x + " Is " + Integer.toBinaryString(x)); 
} 

이 나를을 제공합니다 : 그래서 수 (101)가 나는 자바에서이 예제를 시도 할 때 1 단계는 이제 011 초래한다 왼쪽 쉬프트가 있다고, 그냥 같은 제로의 무리를 보여줍니다 다음 결과 :

37 Is 100101 
620756992 Is 100101000000000000000000000000 

당신이 볼 수 있듯이, 그것은 merly 아무 것도 이동하지 않고 후행 0을 추가했습니다. 나는 또한 state = Integer.rotateRight(state,8); 방법을 시도했다, 그것은 똑같이한다. 내가 여기서 무엇을 놓치고 있니?

답변

2

예상대로 작동한다고 생각합니다. 누락 된 부분은 비트 수로 표현 된 것입니다. 처음 인쇄 할 때는 0을 건너 뜁니다. 정수는 32 비트에 저장되므로 전체 표현은 다음과 같습니다

int x = 37; 
00000000000000000000000000100101 

x = (x >>> 8) | (x << (Integer.SIZE - 8)); 
00100101000000000000000000000000 

편집 여기

정수의 전체 문자열 표현을 얻을 수있는 방법이다 :

public static String toBinaryStringWithLeadingZeros(int x) { 
    StringBuffer buf = new StringBuffer(32); 
    char[] arr = new char[Integer.numberOfLeadingZeros(x)]; 
    Arrays.fill(arr, '0'); 
    buf.append(arr); 
    buf.append(Integer.toBinaryString(x)); 
    return buf.toString(); 
} 
+0

이것은 정확한 대답입니다. 그것을 시험하는 쉬운 방법은 교대 '37'32 시간에 의하여이고 당신은 본래 "37"를 얻을 것이다. – kkflf

+0

바이너리 문자열이 모든 0을 인쇄하지 않는다는 사실을 조금 오해하지 않는가? – kadde23

+0

제 취향에 따라 오해의 소지가있을 수 있습니다. 전체 표현을 인쇄 할 수있는 옵션이 있는지 확인해 보지만 찾을 수는 없습니다. – kaos

0

당신의 코드 및 Integer.rotateRight(state,8); 같은 결과를 내고 예상대로 작동합니다. 당신이 그것을 오른쪽으로 회전 8 시간을 이동하면

00000000000000000000000000100101 

당신이 얻을 :

00100101000000000000000000000000 
가 당신이 무엇을보고 그렇게 앞에 0을

Integer.toBinaryString(x)) 폐기는 첫 번째 경우에 100101입니다 자바 int 그렇게 100101 실제로 4 바이트 두 번째 (처음 두 개의 0은 버려짐)의 100101000000000000000000000000.