2011-03-31 6 views
2

내 목표는 각 비트에 값을 할당하여 char 변수의 프레임을 만드는 것입니다. 즉, 각 비트에 0과 1을 할당해야합니다. 문자 변수의 비트 조작

는 다음 코드했다 :

char packet; 
int bit; 
packet &= ~(1 << 0); 

packet |= (1 << 1); 

printf("\n Checking each bit of packet: \n"); 

for(int x=0;x<2;x++) 
{ 
    bit = packet & (1 << x); 
    printf("\nBit [%d] of packet : %d", x, bit); 
} 

을하지만 점점 오전 출력은 다음과 같습니다

Bit[0] of packet : 0 
Bit[1] of packet : 2

문제가 여기에 무엇입니까?

+1

실제로 무엇을하려고하는지 명확하지 않습니다. 너는 무엇을 기대하고 있니? – yan

+0

이것은 여러분의 코드가하는 것입니다. g = 쓰레기 (초기화되지 않은 메모리 비트)로 둡니다. "g g g g g g g"로 시작하십시오. 첫 번째 비트 연산은 "g g g g g g 0"을 만들고 두 번째 비트 연산은 "g g g g g 0 0"을 만듭니다. 루프는 단순히 [0] = 0x00 (첫 번째 비트는 0)을 출력합니다. 및 [1] = 0x02 (두 번째 비트는 1 임). 그래서 기본적으로 많은 사람들이 정기적으로 말하기 때문에 "설계된대로 작동합니다" – DXM

답변

3

여기에 문제가 없으며 출력이 정확합니다. 여기

는 이유 : 당신이 |=와 패킷의 값을 설정할 때

, 값은 당신이 bit-packet & (1 << x)를 할당 할 때 진수, 2 인 10, 당신은 실제로 값 2 (지정하고 10 바이너리).

Wikipedia entry:

는 2 비트는 비트 단위 1이며 그리고 인가 여부를 확인하는 상기 제 2 비트 1을 포함하는 다른 비트 패턴 :

0011 (decimal 3) 
AND 0010 (decimal 2) 
    = 0010 (decimal 2) 

을 비트가 설정되었는지 여부에 대한 부울 값을 단순히 확인하는 것이 목적이라면 단순히 bool 값으로 캐스트하면됩니다.

(희망 모든 만든 감각, 내가 좀 피곤 기압 해요 그;))

0

출력이 완전히 예상됩니다. 비트 0이 설정되지 않고 비트 1이 설정됩니다. 아마도 당신이있어

bit = !!(packet & (1 << x)); 

후 ... 당신이 0 또는 1 결과를 얻으려면.

그런데 초기화해야합니다 packet - 초기화되지 않은 변수를 사용하면 정의되지 않은 동작이 발생합니다.

+0

아니면 그냥 ... bit = packet >> x & 1;' – domen

1

우선 : packet 때문에이 신뢰할 수 없습니다

char packet; 
packet &= ~(1 << 0); 

는 마지막으로 메모리에 있었다 무엇으로 시작합니다 (예 : 쓰레기). 1 << 0은 단지 1입니다. ~1은 ... 111110입니다. packet을 사용하면 마지막에 메모리에 있던 내용에 따라 매번 다른 대답을 얻을 수 있습니다. 유일하게 확실한 점은 마지막 비트 (예 : 최하위 비트)가 0으로 설정된다는 것입니다.

packet |= (1 << 1); 

이 값은 두 번째 비트를 1으로 설정합니다. 이제 packetxxxxxx10입니다.

그러면 루프가 처음 두 비트를 처리합니다. 각 비트는 packet & (1 << x)으로 마스크 처리되지만, 만 마스크하면 주변을 이동하지 않습니다.따라서 첫 번째 반복에서 1 << x1이고 첫 번째 비트 (0)가 표시됩니다. 두 번째 반복 인 1 << x10 또는 10 진수 2입니다. xxxxxx1010과 함께 쓰면 10이되며 즉시 출력됩니다 (2으로 표시됨).

당신은, 당신이 사용할 수 (0 또는 1로 분리하기 위해) 비트를 이동하려면 : 더 읽기

bit = (packet & (1 << x)) >> x; 

또는 동등하지만

bit = (packet >> x) & 1; 

이 의지 출력을 0 (0, 2) 대신 1 (원하는 것으로 가정 함) 출력을 얻습니다.