2016-06-10 4 views
0

여기 답 본 적이 : http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_2:Exercise_6K & R 운동 2-6 "setbits는"

을하고 난 첫 번째 테스트했지만,이 부분에 :

x = 29638; 
y = 999; 
p = 10; 
n = 8; 

return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) 

종이의 그것에게 줄 저 6 만 프로그램에서이 부분에 28678 ...

을 반환 : 결과에

111001111000110 
&000100000000111 

가장 왼쪽에있는 결과를

비트의 출력과 피연산자 중 어느 비트가 0 인 경우 피연산자의 대응하는 비트가 1 인 경우 1이고, 세 비트는 1 개 x처럼의 있지만 비트 연산자 & 말한다이어야 해당 비트의 0으로 평가됩니다.

그래서 왜 3의 비트가 1로 반환됩니까?

+0

내가 이것을 실행할 때,'&'연산자의 오른쪽은'0x0807' 대신에'0xf807'으로 평가됩니다. 나는 이것이 표식 확장의 결과라고 생각한다. –

+1

기다려야한다. 부호 확장이 아니라는 것을 기다려야한다. 단지 '~ 0 << 11' ='0xf000'이고, 7과 OR-ing은 그 상위 비트 1을 제거하지 않는다. 'y'는 어떻게 됐어? –

+0

링크에서보세요, 전체 프로그램이 있습니다, 그냥이 부분을 잘라 내기 원인은 어디에서 문제입니까 – cristch

답변

2

한 번에 한 단계 씩 이동합니다 (16 비트 숫자 사용). (진수) 숫자를 대입

(x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) 

: 우리는 시작 비트 시프트 금액을 합계

(29638 & ((~0 << (10 + 1)) | (~(~0 << (10 + 1 - 8))))) 

는 제공 : 이진

(29638 & ((~0 << 11) | (~(~0 << 3)))) 

다시 쓰기 숫자와 ~0의 적용 ...

(0111001111000110 & ((1111111111111111 << 1011) | (~(1111111111111111 << 0011)))) 
,210

손떨림을 수행 한 후 우리가 얻을 :

(0111001111000110 & (1111100000000000 | 0000000000000111)) 

그리고 비트 단위 OR (|) :

0111001111000110 & 1111100000000111 

그리고

(0111001111000110 & (1111100000000000 | (~ 1111111111111000))) 

은 (~) 다른-NOT 비트 적용 마지막으로 비트 AND (&) :

0111000000000110 

따라서 우리는 이진수가 01110000000001102 + 4 + 4096 + 8192 + 1638428678입니다.

+0

~ 0은 1의 x에서 비트의 양과 같습니다. "0 ~ 1 << 3"= ~ (1 << 3)과 같은 식으로 이해했습니다. "~ 0은 1의 모든 비트입니다. = ~ 1000 = 0111 ... – cristch

+0

@cristch'0'은 모두 0 비트입니다 ...비트 NOT ('~')은 각 비트를 그 반대로 반전시키고, 모든 0을 1로 변경합니다. 그래서'~ 0'은 1을 모두줍니다. 8 비트로'~ (~ 0 << 3)'='~ (~ 00000000 << 3)'='~ (11111111 << 3)'='~ 11111000' = '00000111' – Dmitri

+0

그래서 나는 8/16/32 비트의 템플릿을 사용 하시겠습니까? 나는 그 부분을 이해하지 못했다. 그래서 나는 내가 연산을 할 때, 더 작은 비트 수의 왼쪽에 0을 더했다. 즉, 나는 이것을 수행했다 : 110110 & 101이 경우 110110은 6을 가지고 있기 때문에 101에 3을 0으로 덧붙여서 : 110110 & 000101 ... 나는 기초가없는이 모든 것을 배우므로 모를 물건이 너무 많습니다 ... – cristch