일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- bagofwords
- CodeTranslation
- NLTK
- 해킹입문
- lemmatization
- DNS해킹
- youtubeNormaltic
- pos tagging
- C
- 15679
- HEaaN
- pynput
- Private AI
- 모두의 깃&깃허브
- kali
- DNS개념
- 동형암호
- 노말틱
- CProgramming
- MachineCode
- bettercap
- Normaltic
- AI
- 해킹 용어
- stopword
- 비트시프트
- 딥러닝
- MITM
- c언어
- NLP
- Today
- Total
일단 테크블로그😊
[2진수,비트연산] 비트연산으로 비트를 끄고 켜보자! 본문
이진수의 특정 비트 설정 및 지우기
이번 포스트에서는 C언어를 사용하여 이진수의 특정 비트를 끄고 켜보도록 하겠습니다.
0. 함수 정의
// 1. is_set_bit >> 비트가 1로 설정되어 있는지 확인
int is_bit_set(unsigned char value, int position) {
return (value & (1 << position)) != 0;
}
비트 on/off 확인 함수입니다. 입력받은 value에 대해 비트연산을 수행하여 켜져 있는 비트를 확인하는 함수입니다. 예를 들어 value가 1111이고 position이 3이라면, 우선 0001의 1을 왼쪽으로 3번 이동하여 1000을 만들게 되고, 1111과 1000을 '&(AND)'연산하게 됩니다. 4번째 자리 수 비트가 1이므로 값은 0이 아닐 테고, True값(C언에어서 0이 아닌 값은 참이므로)이 return 됩니다.
// 2. set_bit >> 설정되어 있지 않은 비트 켜기
unsigned char set_bit(unsigned char value, int position) {
return value | (1 << position);
}
비트 켜기 함수입니다. 위와 비슷한 연산과정을 진행한 뒤에, value와 '|(OR)' 연산을 실시합니다. 해당 position의 비트가 켜져 있든 꺼져있든, 해당 position의 비트와 1이 OR연산되므로 켜지게 됩니다.
// 3. clear_bit >> 설정된 비트 끄기
unsigned char clear_bit(unsigned char value, int position) {
return value & ~(1 << position);
}
비트 끄기 함수입니다. 켜기 함수와 마찬가지로 원하는 position에 1을 설정한 뒤 '~(NOT)'연산을 통해 비트를 반전시킵니다. 이후 value와 &연산을 진행합니다. 그러면 켜져 있는 자리의 비트는 &1이 연산되어 고유의 1과 0이 유지될 것이고, 원하는 포지션의 비트는 &0이 연산되어 무조건 0으로 바뀌며 꺼지게 됩니다.
// 4. for문을 통해 2진수 출력하기
unsigned char clear_bit(unsigned char value, int position) {
return value & ~(1 << position);
}
2진수를 for문을 통하여 간편하게 출력할 수 있는 함수입니다. 이를 통해 10진수를 2진수로 출력할 수 있습니다.
1. 함수 소개
int main(void) {
unsigned char value = 0b01001001; // 0100 1001 (73)
printf("Current value = ");
print_bits(value);
// 1. is_set_bit >> 비트가 1로 설정되어 있는지 확인
if (is_bit_set(value, 3)) {
printf("4th bit is set!\n");
} else {
printf("4th bit is not set.\n");
}
// 2. set_bit >> 설정되어 있지 않은 비트 켜기
value = set_bit(value, 2);
printf("Value after being set:");
print_bits(value);
// 3. clear_bit >> 설정된 비트 끄기
value = clear_bit(value, 6);
printf("Value after being cleared:");
print_bits(value);
return 0;
실행결과는 다음과 같습니다.
4th bit is set!
Value after being set:01001101
Value after being cleared:00001101
직접 함수 실행과정을 살펴봅시다. value를 0100 1001 (10진수로 73)으로 초기화합니다.
1. is_set_bit 함수에서 position을 3으로 설정하여, 왼쪽으로부터 3번 이동한 4번째 위치의 비트가 켜져 있는지 꺼져있는지 확인하였습니다. 0100 1000(2)과 position 3인 0000 1000(2)과 &연산을 하게 될 경우 0이 아닌 값이 return 되므로, if문이 참이 됩니다.
2. set_bit 함수에서 position을 2로 설정, 0000 0100(2)과 0100 1001(2)을 OR연산합니다. set 이후 3번째 자리의 꺼진 비트가 켜지게 됩니다.
3.clear bit 함수입니다. 7번째 비트를 끄기 위하여 포지션을 6으로 설정하여 0100 0000(2)을 생성한 뒤, NOT으로 비트반전하여 1011 1111(2)로 바꿔줍니다. 그리고 set 된 이후의 value인 0100 1100(2)과 AND연산을 실시하게 되면,
0100 1100 [value]
1011 1111 [~(1 << position)]
----------------
0000 1100 [After cleared]
원하는 결과가 나오는 것을 확인할 수 있습니다.
이번 포스팅을 통하여 2진수의 연산과 C언어의 비트시프트 연산자를 통해 개별 비트를 조작해 보는 과정을 살펴보았습니다. 여러분 모두 2진수와 좀 더 친해질 수 있는 시간이 되셨길 바랍니다!!
😊소중한 의견, 피드백 감사합니다!!😊
'Study > Computer Science' 카테고리의 다른 글
[CS 기초] DataType과 Overflow를 알아보자! (2) | 2023.09.15 |
---|