1111 0001을
num4 = num2 << 2 하면
1100 0111이 아닌 어쨰서
1100 0100이 되는지 궁금합니다
첫 번째 비트가 1이면 0 대신 1이 채워진다고 설명엔 적혀있었는데
이게 이해가 안가네요..
int num1 = 2;
int num2 = 4;
num2 = num1 << num1 < num2 + 1;
풀어보면
num2 = 2 << 2 < 4 + 1이 되는데
저 <이 AND 연산자도 아니고
어째서 0이 나오는지 이해가 안됩니다....
<는 비교 연산자입니다.
num2 = 2 << 2 < 4 + 1은 연산자 우선순위에 따라
8 < 5가 됩니다.
8 < 5는 거짓이므로 0이 됩니다.
따라서 num2는 0이 됩니다.
8 > 5이면 참이므로 1이 됩니다.
부호 있는 자료형과 부호 없는 자료형일 때가 다릅니다.
대부분은 부호 있는 자료형일 때가 문제입니다.
부호 있는 자료형은 >>와 <<이 다릅니다.
1100 0010이 부호 있는 자료형이고, 첫 번째 비트는 1, 즉 부호 비트가 1이므로 음수입니다.
1100 0010 >> 1
1비트 이동하면
1X10 0001이 됩니다. X라는 빈 공간이 생기고, 이때 X를 1로 채우게 됩니다.
1110 0001이 됩니다. 이는 부호 있는 정수, 음수일 때 >> 이동입니다.
<< 이동은 부호 있는 정수, 부호 없는 정수 모두 비는 비트를 0으로 채웁니다.
1100 0010 << 1이면
1000 010X가 되고, X를 0으로 채웁니다.
즉 1000 0100이 됩니다.
1100 0010 << 2이면
0000 1000이 됩니다. 부호 비트도 바꾸는 결과가 됩니다.
부호 비트가 있는 숫자의 비트 이동은 예기치 않은 결과를 가져올 수 있으므로 실제로는 거의 쓰이지 않습니다. 비트 이동을 할 때는 대부분 부호 없는 정수, unsigned 자료형에 대해서만 사용합니다.
예시로 사용한 1100 0010을 조금 더 살펴보겠습니다.
부호 있는 정수에서 1100 0010 = -62입니다.
-62를 어떻게 비트로 표현하는지는 보수 연산을 알아야 하지만, 이는 컴퓨터 구조 과목에 해당하니 간단하게 공식으로만 설명하겠습니다.
컴퓨터 구조 과목에 대해서는 이전 답변을 참고해주세요.
https://dojang.io/mod/forum/discuss.php?d=143#p341
-62를 표현하려면 62의 비트 표현을 알아야 합니다.
62 = 0011 1110고, 이를 반전합니다.(1의 보수)
1100 0001이 되고, 여기에 1을 더합니다.
1100 0010이 됩니다.
즉, -62 = 1101 0001이 됩니다.
-62 >> 2를 하면 비트 표현으로는
1100 0010 >> 2
1XX1 0000가 되고, X는 1로 채워집니다.(부호 있는 정수, 음수, >> 비트 이동)
따라서 1111 0000이 됩니다. 이는 -16에 해당합니다.
-16이 맞는지 검증하기 위해 16을 먼저 구해봅니다.
16 = 0001 0000이고, 비트를 모두 반전합니다.(1의 보수)
1110 1111에 비트를 1 더합니다. 2진수는 2가 되면 자리 올림이 발생합니다.
1111 0000 = -16이 됩니다.
-62인 1100 0010에서 << 2는 모두 0으로 채워집니다.
0000 1000이 되고, 이는 8이 됩니다. 음수가 유지되는 것도 아니고, 예상하지 못한 값이 나옵니다.
부호 있는 정수에 대해서 비트 이동 연산은 가능하지만, 이런 이유로 실무에서는 보통은 쓰지 않습니다. 비트 이동 연산은 대부분은 부호 없는 정수, unsigned 자료형에 씁니다.
정리하자면
<< 연산은 부족한 비트를 0으로 채운다.
>> 연산은 부호 비트에 따라 채운다. 양수이면 0으로 채우고, 음수이면 1로 채운다.
0111 1111 >> 2는 양수이고, 부호 비트 0이므로 0001 1111가 된다고 생각하고
1111 1111 >> 2는 음수이고, 부호 비트 1이므로 1111 1111가 된다고 생각하면 됩니다.
-1은 1111 1111이고
이런 특성으로 인해 >> 비트 이동을 몇 번을 해도 -1이 됩니다.
-1 >> 2를 해도 -1이고 -1 >> 7을 해도 -1이 되는 건 이런 특성 때문입니다.
전문적인 내용은 컴퓨터 구조와 논리회로에서 배우게 됩니다. 이전 답변을 참조해주세요.
https://dojang.io/mod/forum/discuss.php?d=143#p341