2012-04-24 2 views
0

저는 10 비트 바이너리 문자열을 가지고 있고 반복적으로 비트 단위로 순환 쉬프트해야합니다. 나는 너무 혼란스럽고 잃어 버렸습니다. 그것 뒤에있는 논리는 쉽게 할 수 있습니까? 16 진수 일 경우 num >> 1 또는 num < < 1을 사용할 수 있지만 비트 시프트를 적용하기 전에 "1010101010"과 같은 문자열을 16 진수로 변환해야합니다. 나는 bitwise shift를 순환 적으로 10 번 적용해야한다.Java에서 이진 문자열을 비트 시프트하는 방법은 무엇입니까?

+4

길이 10의 이진 문자열에 순환 시프트를 10 번 적용하면 null 연산이됩니다 ... –

+0

이것이 숙제 문제입니까? (괜찮 으면, 그냥 하나의 태그를 붙여야한다.) – JRaymond

+0

전혀 ... 나는 비트 조작과 논리를 쓰기에 열정적이다. – volatNumbers

답변

1

일반적으로 말하기를 숫자 작업을 수행하려는 경우 번호에 적용하는 것이 가장 좋습니다. 그래서 문자열을 int (또는 무엇이든) 실제로 변환하는 것이 좋습니다. 그런 다음 비트 이동을 수행 한 다음 필요한 경우 문자열로 되돌릴 수 있습니다.

텍스트 작업 만 수행하려는 경우 StringBuffer를 사용하여 문자로 재생할 수 있습니다.

StringBuffer s = new StringBuffer("1010101010"); 
for(int i=0; i<10; i++) { 
    char c = s.charAt(0); 
    s.append(c); 
    s.deleteCharAt(0); 
} 
String result = s.toString(); 

하지만 당신은 단지 수학을하려고 노력한다면 그건 그냥 추한

2

바이너리 문자열로/변환 할 수있는 정수 클래스의 방법이 있습니다.

int i = Integer.parseInt("1010101010", 2); 
    String shiftedi = Integer.toBinaryString(i<<1); 

편집, 위하지만 원형 아니지만, 당신은 간단한 문자열 작업을 사용할 수 있습니다

String in = "1010101010"; 
String shifted1 = in.substring(1)+in.substring(0,1); 
0
int bits = Integer.parseInt ("010101010", 2); 

가 INT로 문자열을 변환합니다. "비트 시프트를 적용하기 전에 16 진수로 변환"은 말도 안되는 일입니다 - 죄송합니다. 16 진수는 int (예를 들어)를 나타내는 방법 일뿐입니다. int 값을 이동합니다. 표현이 아닙니다.

1

0과 1을 포함한 String (일명 "2 진 문자열")을 처리한다고 가정하면 비트 단위로 쉬프트하는 것이 쉽습니다.

"왼쪽으로 시프트"하려면 "왼쪽 시프트"마다 오른쪽 끝에 "0"문자를 추가하십시오.

"오른쪽으로 이동"하려면 일이 좀 더 복잡합니다. 바이너리에서 항상 "양수"를 처리한다고 가정 할 때, "오른쪽 이동"마다 오른쪽 끝에있는 문자를 제거하십시오. "부호 확장 시프트 권한"을 수행하려면 문자열의 길이를 검사하여 이진 값의 특정 인코딩에 대한 2의 보수 형식 인 "최대 길이"인지 확인해야합니다. 맨 오른쪽 문자가 이미 "1"인 경우 선택적으로 왼쪽에 "1"문자를 추가하십시오. 문자열 (단어와 DWORD에 을하는 동안) 길이에 제약을받지 않기 때문에

지금, >>> 운영자 이진 문자열을 의미하게, 또는 음수을의 경우에도 2의 보수 표현인지 명확하지 않다 문자열의 유효한 문자 수에 "제한"을 두지 않는 한 이진 문자열에 대해 의미가 있습니다. 두 개의 이진 문자열 사이에 이진수 연산을 원한다면이 제한은 두 이진 문자열에 대해 동일해야합니다 (또는 작은 문자열에 대한 수준 올리기 규칙이 있어야 함).

다른 옵션은 문자열을 정수로 변환하고 정수에 대해 이진 연산을 사용하는 것입니다.

관련 문제