2013-10-09 1 views
0

두 세트의 16 진수를 변경 한 다음 새로운 부호없는 char에 저장하는 코드가 있습니다. 코드는 다음과 같습니다 :비트 마스킹 XOR 코드 로직

unsigned char OldSw = 0x1D; 
unsigned char NewSw = 0xF0; 
unsgined char ChangedSw; 

ChangedSw = (OldSw^~NewSw) & ~OldSw; 

그래서 내가 알고있는 것은 :

0x1D = 0001 1101

의 0xF0 = 1111 0000

changedSw 라인이 무엇을하고 있는지에 임 혼란. 나는 그것이 0x02 출력을 줄 것이라는 것을 안다. 그러나 나는 그것을하는 방법을 이해할 수 없다.

+1

종이에 작업을 하나씩 수행하십시오. 먼저 'NewSw'의 반전을 수행 한 다음 XOR을 수행 한 다음 'OldSw'의 반전을 수행하고 마지막으로 AND를 수행하십시오. 그렇다면 정확히 무슨 일이 일어나는 지 알게 될 것입니다. –

+0

그래서 반전 된 NewSw는 0000 1111이 될까요? 그런 다음 XOR은 0x0D로 가져옵니다. 그럼 나는 반전 된 oldSw와 그걸 썼을 까? – user081608

+0

예, 그게 무슨 일 이죠. –

답변

0

ChangedSw = (OldSw^~NewSw) & ~OldSw;

그것은 수단 "제로 OldSw 하나의 부분과 다른 부분 역". NewSwOldSw의 어떤 비트가 0이고 어떤 비트가 반전되는지 나타냅니다. 즉, NewSw의 1은 제로가 될 비트를 나타내고, 0은 반전 될 비트를 나타냅니다.

이 작업은 두 단계로 구현됩니다.

단계 1. 비트를 뒤집습니다.

(OldSw^~NewSw)

:

0001 1101 
^ 0000 1111 
    --------- 
    0001 0010 

참조, 우리는 원래 NewSw에 공의를했다 비트를 반전.

단계 2. 이전 단계에서 반전되지 않은 0 비트.

& ~OldSw

:

0001 0010 
& 1110 0010 
    --------- 
    0000 0010 
참조, 그것은 거꾸로 비트를 변경하지 않습니다

하지만 제로 모든 나머지.

+0

'~ ~ OldSw'는 이전 단계에서 반전되지 않은 비트가 아니라 oldSW에서 0 인 비트를 0으로 만듭니다. 또한 * "NewSw의 1은 비트를 0으로 표시 함"*은 오도 된 것입니다. –

+0

@MartinR "oldSW에서 0 인 비트를 0으로 만든다"- 무슨 뜻입니까? OldSw에서 비트 1은 0이지만 결과는 0x02입니다. 비트 1은 결과에서 제로 비트가 아니다. 어떻게 제로 될 수 있습니까? – kotlomoy

+0

죄송합니다. 잘못된 길로 왔습니다.'& ~ OldSw'는 OldSW에서 * one * 비트를 0으로 만듭니다. 제 요점은이 단계가 NewSw와 독립적이며 이전 단계와 독립적이라는 것입니다. –

-1

첫 번째 부분은 1F 즉입니다.

 
0001 1111 
1110 0010 
---------- 
0000 0010 

그래서 출력이 물결표 연산자는 1의 보수 2.이 될 것입니다 : (1110 0010) oldsw ~로 끝난 0001 1111.So는 작업은 다음과 같이 될 것입니다.

+0

1F는 어떻게 얻었습니까? – user081608

+3

대답이 잘못되었습니다. 중간 단계, 즉'OldSw^~ NewSw'는'0x1F'가 아닙니다. '0001 0010' 또는'0x12'이어야합니다. – Pankrates