2017-11-30 31 views
-2

이 간단한 코드를 작성했습니다 : 비트 연산자. 출력이 매우 이상합니다. 비트를 변경하면 1<<i에서 1>>i까지와은 항상 0입니다. 출력을 참조하십시오.이 비트 연산이 작동하지 않는 이유를 모르겠다

reg=31272 
#binreg=111101000101000 
print bin(reg) 
for i in range(0,15): 
    mask=1<<i 
    c=reg & mask 
    print "i:", i ,"c:", c ,"-", bin(c) 

출력 :

bitwise_little_endian(): 
0b111101000101000 
i: 0 c: 0 - 0b0 
i: 1 c: 0 - 0b0 
i: 2 c: 0 - 0b0 
i: 3 c: 8 - 0b1000 
i: 4 c: 0 - 0b0 
i: 5 c: 32 - 0b100000 
i: 6 c: 0 - 0b0 
i: 7 c: 0 - 0b0 
i: 8 c: 0 - 0b0 
i: 9 c: 512 - 0b1000000000 
i: 10 c: 0 - 0b0 
i: 11 c: 2048 - 0b100000000000 
i: 12 c: 4096 - 0b1000000000000 
i: 13 c: 8192 - 0b10000000000000 
i: 14 c: 16384 - 0b100000000000000 


bitwise_big_endian(): 
0b111101000101000 
i: 0 c: 0 - 0b0 
i: 1 c: 0 - 0b0 
i: 2 c: 0 - 0b0 
.... 
.... 
+5

왜 결과 * *가 0이 될 것이라고 기대하십니까? '1 >> i는 임의의 양수 'i'에 대해 0이고 'anything & 0'는 0입니다. – user2357112

+0

오, 1 << N 왼쪽으로 이동하지만 1 >> N 오른쪽으로 이동하기 때문입니다. 따라서 아치가 리틀 엔디안이기 때문에 마지막 비트 (16 비트) 이후에 패딩은 항상 0입니다. 이 설명이 맞습니까? –

+0

아니요. 나는 당신이 거기에서 말하려고하는 것이 확실치 않지만, 엔디안은 사물에 들어 가지 않으며 16 비트가 아닙니다. – user2357112

답변

1

가 여기에 좀 더 읽을 수있는 방식으로 결과를 인쇄하기 위해 수정 코드의 재 버전입니다 (bit_length()의 사용이 2.7 이상 파이썬을 필요로합니다).

reg = 31272 # 0b111101000101000 
num_bits = reg.bit_length() 
print('reg: 0b{:0{width}b}'.format(reg, width=num_bits)) 

for i in range(num_bits): # Test each bit in "reg". 
    mask = 1 << i 
    c = reg & mask 
    print('i: {:>2}, c: {:6,} - 0b{:0{width}b}'.format(i, c, c, width=num_bits)) 

출력 :

reg: 0b111101000101000 
i: 0, c:  0 - 0b000000000000000 
i: 1, c:  0 - 0b000000000000000 
i: 2, c:  0 - 0b000000000000000 
i: 3, c:  8 - 0b000000000001000 
i: 4, c:  0 - 0b000000000000000 
i: 5, c:  32 - 0b000000000100000 
i: 6, c:  0 - 0b000000000000000 
i: 7, c:  0 - 0b000000000000000 
i: 8, c:  0 - 0b000000000000000 
i: 9, c: 512 - 0b000001000000000 
i: 10, c:  0 - 0b000000000000000 
i: 11, c: 2,048 - 0b000100000000000 
i: 12, c: 4,096 - 0b001000000000000 
i: 13, c: 8,192 - 0b010000000000000 
i: 14, c: 16,384 - 0b100000000000000 

출력은 나에게 의미를 보인다. 마스킹 작업의 결과는 테스트중인 비트를 분리하기 때문에 상대적으로 큰 숫자 일 수 있지만 비트는 테스트중인 정수 값의 내부 이진 표현에서 원래 위치에 있기 때문에 이해해야합니다.

+1

감사합니다. @martneau. –