2014-03-13 1 views
0
String message = "1"; 
     byte[] bytes = message.getBytes(); 

     System.out.println(bytes[0] + ": "); 
     for (int i = 0; i < 8; i++) { 
      System.out.print((bytes[0] >> (7 - i)) + " "); 
     } 

Output: 49: 
0 0 1 3 6 12 24 49 

그래서 내 문자열을 ASCII에서 49입니다 1입니다 값. 내가 이해하려고 노력하는 것은 내 비트가 3,6,12,24 및 49 값을 갖는 이유입니다. 뒤에 무슨 일이 일어나고, 왜 처음과 같이 0과 1만이 아닌가? 이진시프트 된 비트는

+0

'49'의 이진 표현을 노트북에 연필로 쓰십시오. 그리고 1 씩 1 씩 8 번 이동하고 각 턴마다 어떤 가치가 있는지보십시오. –

+0

알겠습니다. 각 시퀀스를 바이너리로 인쇄 할 수있는 방법이 있습니까? –

+0

예, 결과에서 '& 1'을 수행하여 마지막 비트를 얻을 수 있습니다. –

답변

4

49

110001 

당신은 7, 6, 5, 4, ..., (7 - i) 비트가 동일한 값을 이동한다.

그래서

00110001 >> 7 ==> 00000000 == 0 
00110001 >> 6 ==> 00000000 == 0 
00110001 >> 5 ==> 00000001 == 1 
00110001 >> 4 ==> 00000011 == 3 
... 

당신은 String로 정수 값의 이진 표현을 얻을 수 Integer.toBinaryString(int)를 사용할 수 있습니다.

+0

Java에서 이러한 값을 인쇄하는 방법이 있습니까? –

+0

@ user3383062 내 편집을 참조하십시오. –

+1

+1은 Integer.toBinaryString (int)입니다. 좋은 물건. – MirroredFate

2

비트 추출이 잘못되었습니다. 문자 '1'의 비트 표현은 49 : 00110001입니다.

7 번 이동하고 6 번, 5 번 등으로 이동하지만 비트를 올바르게 분리하지 않습니다.

00110001 >> 7 is 00000000 or 0 
00110001 >> 6 is 00000000 or 0 
00110001 >> 5 is 00000001 or 1 
00110001 >> 4 is 00000011 or 3 
00110001 >> 3 is 00000110 or 6 
00110001 >> 2 is 00001100 or 12 
00110001 >> 1 is 00011000 or 24 
00110001 >> 0 is 00110001 or 49 

당신은 당신이 1과 0을 얻기 위해 이동 한 비트를 분리하기 위해 비트를-와 할 1과 함께해야합니다.

System.out.print(((bytes[0] >> (7 - i)) & 1) + " "); 

출력 :이 같은 진 모습에서 수 49

49: 
0 0 1 1 0 0 0 1 
1

마지막 8 비트 : 당신이 바로 k 비트에 의해 수를 이동하면

00110001 

, 그것과 동일합니다 int으로 2 k으로 나눕니다. 즉 (|의 오른쪽에있는 숫자가 삭제됩니다) 당신은 출력에 무엇을 얻을 수 있습니다 :

0 | 0110001 -- 0 
00 | 110001 -- 0 
001 | 10001 -- 1 
0011 | 0001 -- 3 
00110 | 001 -- 6 
001100 | 01 -- 12 
0011000 | 1 -- 24 
00110001 | -- 49 
0

이동, 당신은 (오른쪽이 경우) n 위치 비트를 이동.

그래서 :

Loop# 7-i  bits  result 
0  7  000000000 0 
1  6  000000000 0 
2  5  000000001 1 
3  4  000000011 3 
4  3  000000110 6 
5  2  000001100 12 
6  1  000011000 24 
7  0  000110001 49 

첫 번째 변화는 알 최상위 비트가 이미 이동했기 때문에 01가있는 이유.

마지막 비트를 얻으려면 (a>>s)&1a 숫자로 입력하고 s 원하는 비트를 입력해야합니다. 경우

당신은, 당신은 간단하게 사용할 수 a의 이진 표현을 인쇄 할 Integer.toBinaryString(a);

0

귀하의 실제 데이터가 49이 될 수 있지만, 그것은 당신이 팔을 계산하는 경우, 바이트 데이터 types.So 8 비트를 채우기 위해 필요 0에서 7로 시작하는 비트 (루프 당). 그리고 당신은 오른쪽으로 이동합니다 >>을 사용하고 있습니다.

49 binary is 0 0 1 1 0 0 0 1 

0 0 1 1 0 0 0 1 >> 7-0 = 00000000 = 0 
0 0 1 1 0 0 0 1 >> 7-1 = 00000000 = 0 
0 0 1 1 0 0 0 1 >> 7-2 = 00000001 = 1 
0 0 1 1 0 0 0 1 >> 7-3 = 00000011 = 3 
0 0 1 1 0 0 0 1 >> 7-4 = 00000110 = 6 
0 0 1 1 0 0 0 1 >> 7-5 = 00001100 = 12 
0 0 1 1 0 0 0 1 >> 7-6 = 00011000 = 32 
0 0 1 1 0 0 0 1 >> 7-7 = 00110001 = 49