2013-07-25 3 views
7

이 반대 기능은 무엇입니까?비트 왼쪽 시프트 및 OR 지정 반전

A = (B << 3) | 0x07; 
나는 B 나는 이미 해당 A을 얻을 수있는 방법

?

+1

그래서 왼쪽 3을 이동하고 하위 3 비트를 1로 설정하고 있습니까? 'B = (A >> 3)'의 무엇이 잘못 되었습니까? (당신이 움직일 때 비트를 잃는다는 것을 알고 있다고 가정 할 때) – Nigel

답변

15

모든 비트를 완전히 복구 할 수는 없습니다.

B << 3 'B'는 왼쪽으로 3 비트 이동하고 주변에서 반복되지 않습니다. 이것은 B의 상위 3 비트의 상태가 삭제됩니다 의미 - 당신이 사람들을 알지 못한다면, 당신은 B를 복구 할 수 없을 것입니다

예 :

10101101 << 3 

Turns: 10101101 
      ^---^ 
Into: 01101000 
     ^---^ 

상위 3 비트가 손실되고, 하단 3 개는 0으로 채워집니다. 삭제 된 데이터가 삭제됩니다.

으로 아래의 3 비트를 채우므로, 변경하지 않았더라도 가장 낮은 세 비트를 111으로 지우면 복구 할 수 없게됩니다. 이제

대신 논리합의 xor의 경우, 또 다른 XOR로 복구 할 것 :

A^same-value((A^B)^B) == A

A | same-value이되지 않을 수있는 다른 A^same-value 때문으로 취소 할 수 있습니다 다른 사람과 취소 취소 A | same-value

A | same-value 취소 할 수 없음 ne와 AND : A & same-value

하지만 XOR 된 경우에도 문제는 여전히 발생합니다. 주어진

+2

맞습니다. 당신은 상위 3 비트를 잃게됩니다. 초기 함수가 왼쪽 회전으로 변경 되더라도 여전히 정보를 잃을 것입니다. 0x07'은 어쨌든 가장 오른쪽에있는 3 비트를 설정합니다. – Anthony

1

B = 0b00000000 
B = 0b00100000 
//... 
B = 0b11100000 

같은 A를 얻을 수 있습니다 (시범 단지가, 바이너리 형식에 대한 0b를 사용하여, 예를 들어 8 비트 B 사용), 그래서 당신이 계산을 취소 할 수 있습니다 생각하지 않는다 가장 왼쪽의 3 비트가 손실됩니다.