반응형
#include <stdio.h> //3단계 변수의 특정 비트를 0으로 만드는 예제 //dest_data 변수의 bit_num 번째 있는 비트를 0으로 설정하는 함수로 해당 비트가 0으로 설정된 값을 반환한다. unsigned char ResetBit (unsigned char dest_data , unsigned char bit_num){ //1바이트 변수라서 비트 이동은 0~7 까지 가능함 if (bit_num < 8) { dest_data = dest_data & ~(0x01 << bit_num); } return dest_data; } //3단계 : 변수의 특정 비트를 1로 만드는 예제 unsigned char setBit(unsigned char dest_data, unsigned char bit_num){ /* 1바이트 변수라서 비트 이동은 0~ 7까지 가능*/ if (bit_num < 8) { dest_data = dest_data | (0x01 << bit_num); } return dest_data; } //3단계 변수의 값을 2진수 형태로 확인하는 예제 //dest_data 변수의 bit_num 번째 비트 값을 반환하는 함수 unsigned char GetBit(unsigned char dest_data, unsigned char bit_num){ unsigned char bit_state = 0; /* 1바이트 변수라서 비트 이동은 0 ~ 7 까지만 가능*/ if (bit_num < 8) { bit_state = dest_data & (0x01 << bit_num); bit_state = bit_state >> bit_num; } /* bit_num에 지정한 비트 값을 반환함 */ return bit_state; } int main(int argc, const char * argv[]) { //####################### 비트단위 연산과 비트 패턴 ############################# //c언어에서 제공하는 자료형의 최소 단위는 1바이트 이다. //0,1 중 하나를 저장하더라도 1바이트 저장공간을 사용해야 한다... //but 비트 연산자를 알면 가능하다. unsigned char lamp_state = 0; /* 기본값은 전등이 꺼져 있음 */ lamp_state = 1; /* 전등이 켜지면 1로 변경함 */ //부호 없는 1바이트 변수를 선언하고, 그 변수에 16진수 값 5A로 초기화 하는 코드. //16진수 한자리는 4비트. unsigned char data = 0x5A; /* 2진법 : 0101 1010 , 10진수 : 90*/ printf("%d \n" , data); //90 //시프트 연산자 //오른쪽에서 왼쪽으로 이동 unsigned char l_data = 0x1A; /* 이동전 : 0001 1010 */ printf("%d \n" , l_data); //26 l_data = l_data << 2; /* 이동후 : 0110 1000*/ printf("%d \n" , l_data); //104 (26에 2의 2승을 곱한것과 같다.) //왼쪽에서 오른쪽으로 이동 unsigned char r_data = 0x1A; /* 이동전 : 0001 1010*/ printf("%d \n" , r_data); //26 r_data = r_data >> 2; /* 이동후 : 0000 0110*/ printf("%d \n" , r_data); //6 (26에 2의 2승을 나눈것과 같다.) //변수에 부호가 있는경우 : 부호비트가 1이면 이동한 빈 공간에 1로 채우고, 부호비트가 0이면 이동한 공간에 0으로 채운다. char my_data = 0x85; my_data = my_data >> 3; //지정한 비트를 0으로 설정하기 : and 연산자 사용. 한쪽 비트가 0이면 다른쪽 비트 상관없이 0 //1단계 - 2번 비트를 0으로 설정하기 unsigned char l_a; /*어떤 값이 들어있는지 알 수 없다.*/ l_a = l_a & 0xFB; /* 2번 비트만 0으로 변경함 , FB : 1111 1011 (2번째 비트만 0으로 설정후 and 연산)*/ printf("%d \n" , l_a); /* 2번째 비트만 0으로 변경됨*/ //2단계 - 임의의 비트를 0으로 설정하기 : 16진수 0xFB를 직접 명시하지 않고 2번이라는 정보만 가지고 만들기 unsigned char l_b; /* 어떤 값이 있는지 알 수 없음 */ unsigned char bit_num = 2; /* 0으로 만들 비트의 번호 */ unsigned char mask = ~(0x01 << bit_num); /* 2번 비트로 1을 옮기고 비트를 반전시킴 */ l_b = l_b & mask; /* l_b 의 2번째 비트만 0으로 변경됨*/ //3단계 함수로 만들어 보기 unsigned char sample_data = 0x7F; /* 2진수 : 0111 1111*/ printf("%X ->" , sample_data); /* 값 변경전 출력*/ //변수의 3번째 비트를 0으로 설정함. sample_data = ResetBit(sample_data, 3); printf("%X \n" , sample_data); /* 값 변경후 출력*/ //7F ->77 //지정한 비트를 1로 설정하기 : or 사용. 한쪽 비트가 1이면 다른쪽 비트값에 상관없이 1 //1단계 : 2번비트를 1로 설정하기 unsigned char sample_data1; /* 어떤값이 있는줄 알수 없음 */ sample_data1 = sample_data1 | 0x04; // 변수의 2번비트만 1로 변경 //2단계: 0x04를 직접 명시하지 않고 2번 비트라는 정보만 가지고 만들어본다. unsigned char sample_data2; unsigned char bit_num_new = 2; /* 1로 만들 비트의 번호 */ unsigned char mask_new = 0x01 << bit_num_new; /* 0x04 */ sample_data2 = sample_data2 | mask_new; /* 2번 비트만 1로 변경함*/ //3단계 함수로 만들어보기: 특정 비트를 1로 만드는 예제 unsigned char my_a_data = 0x77; /* 2진수로 0111 0111*/ printf("%X -> " , my_a_data); /* 값 변경전 출력*/ my_a_data = setBit(my_a_data, 3); /* 변수의 3번째 비트를 1로 설정함*/ printf("%X \n" , my_a_data); /* 값 변경후 출력*/ //77 -> 7F //특정비트 값 얻기 : 변수의 비트 패턴에서 특정 비트의 값을 얻고 싶으면 비트 and 연산자를 사용한다. //얻고 싶은 비트 값만 1로 넣고 나머지 비트는 모두 0을 넣어서 숫자를 만들고 and 연산을 하면된다. //1단계 unsigned char a; unsigned char bit_state; /*2번 비트의 값을 저장할 변수 */ bit_state = a & 0x04; /* a의 2번 비트만 값을 유지한 상태로 bit_state에 저장함 0x04 : 0000 0100*/ bit_state = bit_state >> 2; /* bit_state의 값을 0또는 1로 확인가능*/ //2단계 : 임의의 비트 값 얻기 unsigned char my_data2; unsigned char my_bit_num = 2; /* 1로 만들 비트 번호*/ unsigned char my_bit_state; /* 비트의 값을 저장할 변수 */ unsigned char my_mask = 0x01 << my_bit_num; /* 비트 옮긴 후 값은 0x04*/ my_bit_state = my_data2 & my_mask; /* my_data2의 2번 비트만 값을 유지한 상태로 my_bit_state에 저장함*/ my_bit_state = my_bit_state >> my_bit_num; /* 0 또는 1로 확인가능 */ //3단계 : 변수의 값을 2진수 형태로 확인하는 예제 int i; unsigned char data_state = 0x75; /* 2진수 : 0111 0101*/ unsigned char l_bit_state; //8개의 비트 값을 모두 출력하기 위해 8번 반복함 for (i = 0; i < 8; i++) { l_bit_state = GetBit(data_state, 7 - i); /* 비트 값을 출력함 */ printf("%d " , l_bit_state); } //비트값이 모두 출력되면 줄바꿈 printf("\n"); //0 1 1 1 0 1 0 1 //보수를 이용해서 덧셈으로 뺄셈 이용하기 /* 255를 0으로 만드는 숫자를 찾는방법 1111 1111 (255) (비트반전) 0000 0000 (0) - 1의 보수 ( +1) 0000 0001 (1) - 2의 보수 198을 0이 되도록 숫자를 찾는법 1100 0110 (198) (비트반전) 0011 1001 (57) - 1의 보수 (+1) 0011 1010 (58) - 2의 보수 */ return 0; }
복습
V |
do it c언어 책 참고
반응형
댓글