비트 연산은 알지만 비트의 ㅇㅇㅇ를 clear해라~ 를 보면서 어림짐작으로 & 연산자를 사용을 알았지만
자세히는 몰랐기 때문에 조금 정리해보려고 한다.
& AND 같으면1 |
0 | 0 | 0 |
0 | 1 | 0 | |
1 | 0 | 0 | |
1 | 1 | 1 | |
| OR 하나만 1이어도 1 |
0 | 0 | 0 |
0 | 1 | 1 | |
1 | 0 | 1 | |
1 | 1 | 1 | |
^ XOR 다르면1 |
0 | 0 | 0 |
0 | 1 | 1 | |
1 | 0 | 1 | |
1 | 1 | 0 | |
~ NOT 결과값 반대로 |
num 1= 0; num2 = ~num1 //num2 : 1 |
[shift 연산]
<<: 비트를 왼쪽으로 이동 (거듭제곱) (빈자리는 0으로 채운다)
unsigned char num1 = 3; // 3: 0000 0011
printf("%u\n", num1 << 3); // 24: 0001 1000: num1의 비트 값을 왼쪽으로 3번 이동
>> 비트를 오른쪽으로 이동 ( 빈자리가 양수일때는 0, 음수일때는 1로 채운다)
unsigned char num2 = 24; // 24: 0001 1000
printf("%u\n", num2 >> 2); // 6: 0000 0110: num2의 비트 값을 오른쪽으로 2번 이동
&
모두 1이면 1
|
하나만 1이면 1
^
서로 다르면 1, (서로 동일하면 0)
~
반대로 출력
<<
왼쪽으로 비트단위로 이동
* 2배
>>
오른쪽으로 비트단위로 이동
* 1/2 (0.5배)
Mask On
Mask Off
Bit Clear(비트 지우기)
char *A = (char*)0x01010101
=> 변수 A에 0x01010101가 저장되어있음
bit Set 하기
▶ A의 5번 bitfmf 1로 set하려면?
- A |= 0x20; // 방법1
- A |= 0x1 << 5; // 방법 2
- A |= (0x1<<5) + (0x1<<3) + (0x1<<2); // 방법 1
- A |= (0x1<<5) + (0x3<<2); // 방법 2 자리 값을 합쳐서 이동
- A &= ~(0x1<<2);
- A &= ~((0x1<<5)+(0x3<<2));
- A ^= 0x1<<5;
- A ^= (0x1<<5)+(0x1<<2);
- A & (0x1<<5)
- A & 0x7
[출처] 비트 제어(특정비트 제어) Bit-wise set/clear,bit 반전,검사,추출|작성자 Dev
3. 한 바이트에서 1인 비트 세기
한 바이트 곧 8비트에서 1인 비트를 세려면,
비트를 하나씩 오른쪽으로 옮겨서 1과 &연산을 해보면 됩니다.
출처: http://storycompiler.tistory.com/4 [아프니까 개발자다]
// 0번 비트 (맨 우측 비트) 읽기
printf("%d\n", getAbit(num, 0));
// 1
// 1번 비트 (맨 우측에서 2번째 비트) 읽기
'OLD개발이야기 > IT 공부 ' 카테고리의 다른 글
VDI란 (Virtual Desktop Infrastructure 가상 데스크톱 인프라) (0) | 2021.03.30 |
---|---|
[취준] IT 취업준비 DB 관련 자주 나오는 질문 (0) | 2020.12.19 |
VPN (Virtual Private Network) 가상사설망 (0) | 2018.05.15 |
자료구조) 덱 (0) | 2018.05.07 |
자료구조 정리) 큐 (0) | 2018.05.06 |