-
반응형
비트 연산 표 비트 단위로 AND, OR, NOT, XOR(Exclusive OR) 연산을 수행
AND 연산 : A, B 값이 둘 다 1이어야 연산의 결과가 1
OR 연산 : A, B 값이 둘 다 0인 경우에만 연산의 결과가 0
XOR : 현재 비트 패턴이 반전( 0이면 1, 이면 0). 배타적 논리합
NOT : 해당 비트가 0 이면 1, 1이면 0으로 바꿔주는 연산
AND 연산 : A & B
A 비트의 값이 0이면 B 비트의 값에 상관없이 0
A 비트의 값이 1이면 B 비트의 값에 따라 0 또는 1
A 와 B 의 비트 값이 모두 1일 때만 1
OR 연산 : A | B
A 비트의 값이 0이면 B 비트의 값에 따라 0 또는 1
A 비트의 값이 1이면 B 비트의 값에 상관없이 1
A 와 B 의 비트 값이 하나라도 1이면 1
XOR 연산 : A ^ B
연산하는 두 비트의 값이 같으면 0, 다르면 1
A, B의 비트 값이 서로 다른 값일 때 1
NOT 연산 : ~A
각 비트의 값을 반전시키는 작업을 수행
비트가 0이면 1로, 1이면 0으로 반전
비트 연산자 단축 표현
단축 표현에 사용된 연산자들은 연산자 우선순위가 낮기 때문에 다른 연산자와 연산할 때 연산자 우선순위에 주의해야한다.
// 기본 표현 A = A & B; A = A | B; A = A ^ B // 단축 표현 A &= B; A |= B; A ^= B;
비트 단위로 데이터를 다루는 방법
비트 연산자는 최소 1바이트(8비트) 단위로 연산
특정 비트에만 값을 대입하는 연산자는 없음.
비트 연산자의 특성을 이용하여 개발자가 지정한 비트만 연산하도록 직접 구현해야함.
지정한 비트를 0으로 설정하기 : AND 연산자 이용
1단계 : 2번 비트(특정 비트)를 0으로 설정하기
비트 AND 연산의 특징(연산하는 비트 중 하나라도 0이면 결과가 0)을 이용
기존 값을 유지해야하는 비트는 1과 AND 연산
값을 0으로 설정해야하는 비트는 0과 AND 연산
unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음 lamp_state = lamp_state & 0xFB;
2단계 : 임의의 비트를 0으로 설정하기
8개의 비트 중 임의의 비트를 0으로 설정하기 위한 피연산자 상수 만들기
unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음 unsigned char bit_num = 2; // 0으로 만들 비트의 번호 unsigned char mask = ~(0x01 << bitnum); // 0xFB lamp_state = lamp_state & mask; // 0으로 만들 비트의 번호
3단계 : 함수로 만들어보기
8개의 비트 중 임의의 비트를 0으로 설정하기 위한 피연산자 상수 만들기
#include <stdio.h> unsigned char ResetBit(unsigned char dest_data, unsigned char bitnum) { // 1바이트 변수라서 비트 이동은 0~7까지 가능함 if(bit_num < 8) dest_data = dest_data & ~(0x01 << bit_num); // AND 연산자 return dest_data; } void main() { unsigned char lamp_state = 0x77; // 2진수: 0111 0111 printf(“%X->”, lamp_state); lamp_state = SetBit(lamp_state, 3);// 2진수: 0111 1111 printf(“%X\n”, lamp_state; } // 함수 실행결과 7F->77
지정한 비트를 1로 설정하기 : OR 연산자 이용
1단계 : 2번 비트(특정 비트)를 1로 설정하기
비트 OR 연산의 특징(연산하는 비트 중 하나라도 1이면 결과가 1)을 이용
기존 값을 유지해야 하는 비트는 0과 OR 연산
값을 1로 설정해야하는 비트는 1과 OR 연산
unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음 lamp_state = lamp_state & 0x04; // lamp_state의 2번 비트만 1로 변경
2단계: 임의의 비트를 1로 설정하기
8개의 비트 중 임의의 비트를 1로 설정하기 위한 피연산자 상수 만들기
unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음 unsigned char bit_num = 2; unsgiend char mask = 0x01 << bit_num; // bit_num: 0x04 lamp_state = lamp_state & mask; // lamp_state의 2번 비트만 1로 변경
3단계 : 함수로 만들어보기
#include <stdio.h> unsigned char SetBit(unsigned char dest_data, unsigned char bitnum) { // 1바이트 변수라서 비트 이동은 0~7까지 가능함 if(bit_num < 8) dest_data = dest_data | ~(0x01 << bit_num); // OR 연산자 return dest_data; } void main() { unsigned char lamp_state = 0x7F; // 2진수: 0111 1111 printf(“%X->”, lamp_state); lamp_state = ResetBit(lamp_state, 3);// 2진수: 0111 0111 printf(“%X\n”, lamp_state; } // 함수 실행결과 7F->77
특정 비트의 값 얻기 : AND 연산자 이용
1단계 : 2번 비트(특정 비트)의 값 얻기
연산하는 한쪽 비트가 1일 때, 다른 쪽 비트 값이 1이면 1, 0이면 0이 나오는 AND 연산의 특징을 이용
얻고 싶은 번호의 비트만 1로 두고 나머지는 0을 넣어 AND 연산
2번 비트의 값을 0 또는 1로 얻기 위해 2번 비트 값을 0번 비트로 이동
unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음 unsigned char bit_state; // 비트 값을 저장할 변수 bit_state = lamp_state & 0x04; // lamp_state의 2번 비트만 값을 유지한 상태로 bit_state에 저장 bit_state = bit_state >> 2; // bit_state를 통해 2번 비트의 값을 0, 1로 확인 가능
2단계 : 임의의 비트값 얻기
8개의 비트 중 임의의 비트 값을 얻기 위한 피연산자 상수 만들기
unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음 unsigned char bit_num = 2; // 1로 만들 비트의 번호 unsigned char bit_state; // 비트 값을 저장할 변수 unsigned char mask = 0x01 << bit_num; // 비트 이동 후 값은 0x04 bit_state = lamp_state & mask; // lamp_state의 2번 비트만 값을 유지한 상태로 bit_state에 저장 bit_state = bit_state >> bit_num; // bit_state를 통해 bit_num번 비트의 값을 0, 1로 확인 가능
3단계 : 함수로 만들어보기
#include <stdio.h> unsigned char GetBit(unsigned char dest_data, unsigned char bitnum) { unsigned char bit_state = 0; if(bit_num < 8) { bit_state = dest_data & (0x01 << bit_num); bit_state = bit_state >> bit_num; } return bit_state; } void main() { unsigned char lamp_state = 0x75, bit_state; printf(“%X->”, lamp_state); for( int i = 0; i < 8; i++) { bit_state = GetBit(lamp_state, 7-i); // 비트를 표시할 때 최상위 비트(7번)부터 순차적으로 표시하기 위해 내림차순으로 비트값을 얻음 printf(“%d”,bit_state); } printf(“\n”); } // 함수 실행결과 75 -> 01110101
비트 연산자를 활용하는 방법 – 보수를 이용해 덧셈으로 뺄셈 구현하기
부호를 고려하지 않는 1바이트 메모리는 255보다 더 큰 값을 저장하면 오버플로가 발생하여 값을 잃는다.
unsigned char data = 255; data++; // 256이 되어야하지만 오버플로가 발생하여 0이 됨 data++; // 0이 되었으므로 이 명령문에서 1이 저장됨
메모리의 특성을 이용하여 data 변수에 들어가는 값을 0으로 만드는 방법(data 변수 값이 255라고 가정)
1. 255를 뺀다. (data 변수 값과 동일한 값을 뺌) 255 – 255 = 0
2. 1을 더한다. (data 변수값이 256이 되는 값을 더함) 255 + 1 = 0
B에 2의 보수를 더한 것과 B를 뺀 것은 동일함
덧셈으로 뺄셈을 구현할 수 있음
이 개념 때문에 컴퓨터에 뺄셈 회로가 없음
비트 연산자를 활용하는 방법 – 데이터 암호화하기
비트 XOR 연산의 특성(비트 값이 서로 같으면 0, 다르면 1)을 이용
특정 값에 동일한 피연산자로 XOR 연산을 두 번하면 원래 값이 나온다.
반응형'C' 카테고리의 다른 글
지역변수와 전역변수 (0) 2022.04.30 비트 단위 연산자와 비트패턴 (0) 2022.04.28 중첩 반복문(2중 for문), break, continue, 기타 반복문 (0) 2022.04.27