비트연산자 1 1
비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2
진수법! 2, 10, 16, 8! 2 : 0~1 ( )! 10 : 0~9 ( )! 16 : 0~9, 9 a, b, c, d, e, f ( )! 8 : 0~7 ( ) 3 3
진수법 2 10 16 8 0000 0000 0 0 0 0000 0001 1 1 1 0000 0010 2 2 2 0000 0011 3 3 3 0000 0100 4 4 4 0000 0101 5 5 5 0000 0110 6 6 6 0000 0111 7 7 7 0000 1000 8 8 10 2 10 16 8 0000 1001 9 9 11 0000 1010 10 a 12 0000 1011 11 b 13 0000 1100 12 c 14 0000 1101 13 d 15 0000 1110 14 e 16 0000 1111 15 f 17 0001 0000 16 10 20 0001 0001 17 11 21 10 == 0xa == 012 4 4
2 진수를 10 진수로표현하는방법 2 10 2 10 2 10 0000 0000 0000 0110 0000 1100 0000 0001 0000 0111 0000 1101 0000 0010 0000 1000 0000 1110 0000 0011 0000 1001 0000 1111 0000 0100 0000 1010 0001 0000 0000 0101 0000 1011 0001 0001 5 5
2 진수를 16 진수와 8 진수로표현하는방법 6 6
비트연산자! & a & b AND a b OR ^ a ^ b XOR ~ ~a NOT << a << 3 >> a >> 1 7 7
비트연산자 : & 연산자 (1/2)! AND! 1 1 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 8 8
비트연산자 : & 연산자 (2/2) #include<stdio.h> int main(void) { int num1=20, num2=16; int result1; result1 = num1 & num2; printf(" & %d \n", result1); // 16 } return 0; 9 9
비트연산자 : 연산자 (1/2)! OR! 1 1 0 0 0 0 1 1 1 0 1 1 1 1 10 10
비트연산자 : 연산자 (2/2) #include<stdio.h> int main(void) { int num1=20, num2=16; int result1; result1 = num1 num2; printf(" %d \n",result1); } return 0; 11 11
비트연산자 : ^ 연산자 (1/2)! XOR! 1 0 ^ 0 0 0 ^ 1 1 1 ^ 0 1 1 ^ 1 0 12 12
비트연산자 : ^ 연산자 (2/2) #include<stdio.h> int main(void) { int num1=20, num2=16; int result1; result1 = num1 ^ num2; printf(" ^ %d \n",result1); return 0; } 13 13
비트연산자 : ~ 연산자 (1/2)! NOT! ~ 0 1 ~ 1 0 14 14
비트연산자 : ~ 연산자 (2/2) #include<stdio.h> int main(void) { int num1=20; int result1; result1 = ~num1; printf(" ~ %d \n",result1); // -21 } return 0; 15 15
비트연산자 : 비트이동연산자 (1/5)!! << ( )! >> ( ) 16 16
비트연산자 : 비트이동연산자 (2/5) #include<stdio.h> int main(void) { int num1=10; int result1; result1 = num1 << 2; printf(" << %d \n", result1); return 0; } 17 17
비트연산자 : 비트이동연산자 (3/5) result1 = num1 << 2; 1 2 18 18
비트연산자 : 비트이동연산자 (4/5) #include<stdio.h> int main(void) { int num1=10; int num2=-10; int result1; int result2; result1 = num1 >> 1; result2 = num2 >> 1; } printf(" >> %d \n", result1); printf(" >> %d \n", result2); return 0; 19 19
비트연산자 : 비트이동연산자 (5/5) result1 = num1 >> 1; 1 2 result2 = num2 >> 1; 20 20
음수만들기 21 + (-21) = 0 이됨을확인할수있다. 21 21
연습문제 ( 양수, 음수표현문제 ) 가정 : 1 바이트를가지고데이터를표현한다. 따라서가장왼쪽에존재하는비트는부호비트가된다. 문제 1) 양의정수 01001111 00110011 문제 2) 음의정수 10101001 11110000 22 22
연습문제 ( 양수, 음수표현문제 ) 가정 : 1 바이트를가지고데이터를표현한다. 따라서가장왼쪽에존재하는비트는부호비트가된다. 문제 1) 양의정수 01001111 00110011 문제 2) 음의정수 10101001 11110000 =2 6 +2 3 +2 2 +2 1 +2 0 =2 5 +2 4 +2 1 +2 0 = (2 6 +2 4 +2 2 +2 1 +2 0 ) = 2 4 23 23
연습문제 문제 3) 입력받은음의정수값을양의정수값으로바꿔서출력하는프로그램을작성해보자. 단, 반드시비트단위연산자를사용해서구현해야한다. include <stdio.h> int main(void) { int n; } printf("type a negative integer: "); scanf("%d", &n); n =???; n =???; printf("%d \n", n); return 0; 24 24
연습문제 문제 3) 입력받은음의정수값을양의정수값으로바꿔서출력하는프로그램을작성해보자. 단, 반드시비트단위연산자를사용해서구현해야한다. include <stdio.h> int main(void) { int n; } printf("type a negative integer: "); scanf("%d", &n); n = ~n; n = n+1; printf("%d \n", n); return 0; 25 25
연습문제 문제 4) 입력받은값의두배를계산해서출력해주는프로그램을 *( 곱셈 ) 연산이아닌, 비트이동 ( 쉬프트 ) 연산 (<< 또는 >>) 을이용해서구현해보자. 주의 ) 입력값이 -2^30-1 (= -1073741825) 에서 2^30 (=1073741824) 를벗어날경우전혀다른값이출력됨에주의하라. #include <stdio.h> int main(void) { int n; } printf("type an integer value: "); scanf("%d", &n); n =??? ; // double the value of n! printf("%d \n", n); return 0; 26 26
연습문제 문제 4) 입력받은값의두배를계산해서출력해주는프로그램을 *( 곱셈 ) 연산이아닌, 비트이동 ( 쉬프트 ) 연산 (<< 또는 >>) 을이용해서구현해보자. 주의 ) 입력값이 -2^30-1 (= -1073741825) 에서 2^30 (=1073741824) 를벗어날경우전혀다른값이출력됨에주의하라. #include <stdio.h> int main(void) { int n; } printf("type an integer value: "); scanf("%d", &n); n = n<<1; // double the value of n! printf("%d \n", n); return 0; 27 27
연습문제 5-3) 연산우선순위관련 #include <stdio.h> int main(void) { int x=3,y=5,z=3,k=2; int a; a = x < y x < z && z < k; printf("the Result 1 a : %d \n", a); /* The operator ' ' has a higherf priority than '&&'. x < y x < z && z < k = x < y (x < z && z < k) = 1 (0 && 0) = 1 0 = 1 */ a = (x < y x < z) && z < k; printf("the Result 2 a : %d \n", a); /* The part within parentheses has the priority. (x < y x < z) && z < k = (1 0) && 0 = 1 && 0 = 0 */ return 0; } 28 28
5-4) 세개의입력숫자중최대값구하기 연습문제 #include<stdio.h> int main(void) { int a,b,c; int temp,max; printf("put an integer :"),scanf("%d",&a); printf("put an integer :"),scanf("%d",&b); printf("put an integer :"),scanf("%d",&c); temp = (a>b)?a:b; max = (temp>c)?temp:c; printf("the maximum : %d\n",max); } return 0; 29 29
5-7) 네자리의 2 진수입력을받아 10 진수값을출력하기. 연습문제 #include <stdio.h> int main(void) { int first, second, third, fourth, decimal; int dec1, dec2; // for temporary decisions printf("--------between 0000 and 1111, Convert to Demical Number-------\n"); printf("the First : "), scanf("%d",&first); printf("the Second : "), scanf("%d",&second); printf("the Third : "), scanf("%d",&third); printf("the Fourth : "), scanf("%d",&fourth); decimal = (first*1)+(second*2)+(third*4)+(fourth*8); dec1 = first > 1 second > 1 third > 1 fourth > 1; dec2 = first < 0 second < 0 third < 0 fourth < 0; (dec1 dec2)? printf("\n Wrong Input \n") : printf("\nthe binary input %d%d%d%d is converted to the decimal number %d.\n", fourth, third, second, first, decimal); } return 0; 30 30
5-8) 시, 분, 초를입력받아초로계산하기. 연습문제 include <stdio.h> int main(void) { int hour,min,sec,total; int dec1, dec2; printf("put an hour :"); scanf("%d",&hour); printf("put a minute :"); scanf("%d",&min); printf("put a second :"); scanf("%d",&sec); dec1 = hour >= 24 min >= 60 sec >= 60; dec2 = hour < 0 min < 0 sec < 0; total = (hour * 3600) + (min * 60) + sec; (dec1 dec2)? printf("\n Wrong Input \n") : printf("%d\n",total); } return 0; 31 31
5-9) 파운드를킬로그램으로계산하기. 연습문제 #include <stdio.h> int main(void) { double pound = 0.45; double kg; } kg = 150*pound; printf("the 150lb of flour is %.2lf kg.\n",kg); 32 32