[고급 C++] 비트연산자

반응형

 

  비트연산자

 

비트연산자

특징

- 응용 프로그램에서 비트단위(2진수) 연산을 할 때 사용되는 연산자

- 속도가 빠름

 - &|~^>><<

 

예시

#include <stdio.h>

int main()
{
	char n1 = 9, n2 = 5, n3;
	int i;
    
	printf("%d : ", n1);
	for(i=128; i > 0;i = i/2)
		if(i & n1)
			printf("1 ");
		else
			printf("0 ");
	printf("\n");

	printf("%d : ", n2);
	for(i=128; i > 0; i = i/2)
		if(i & n2)
			printf("1 ");
		else
			printf("0 ");
	printf("\n");

	n3 = n1 & n2;	
    printf("%d & %d : ", n1, n2);	
    for(i = 128; i > 0; i = i/2)
		if(i & n3)
			printf("1 ");
		else
			printf("0 ");
	printf("\n");

	n3 = n1 | n2;
	printf("%d | %d : ", n1, n2);
	for(i = 128; i > 0; i = i/2)
		if(i & n3)
			printf("1 ");
		else
			printf("0 ");
		printf("\n");

	printf("~%d : ", n1);

	n3 = ~n1;	
    for(i = 128; i > 0; i = i/2)
		if(i & n3)
			printf("1 ");
		else
		printf("0 ");
	printf("\n");

	printf("%d ^ %d : ", n1, n2);

	n3 = n1 ^ n2;
	for(i = 128; i > 0; i = i/2)
		if(i&n3)
			printf("1 ");
		else
			printf("0 ");
	printf("\n\n");

	n1 <<= 2; // n1=n1<<2;

	printf("%d << 2: ", n1);
	for(i = 128; i > 0; i = i/2)
		if(i & n1)
			printf("1 ");
		else
			printf("0 ");
	printf("\n");

	n2 >>= 1;
	printf("%d  >> 1: ", n2);
	
    for(i = 128; i > 0; i >>=1)  //i=i/2)
		if(i & n2)
			printf("1 ");
		else
			printf("0 ");
	printf("\n");

	return 0;
}

     9 : 0 0 0 0 1 0 0 1
     5 : 0 0 0 0 0 1 0 1
9 & 5 : 0 0 0 0 0 0 0 1
9 | 5 : 0 0 0 0 1 1 0 1
    ~9 : 1 1 1 1 0 1 1 0
9 ^ 5 : 0 0 0 0 1 1 0 0

36 << 2: 0 0 1 0 0 1 0 0
2  >> 1: 0 0 0 0 0 0 1 0

 

활용 : 비교할 비트를 마지막으로 보내어 타겟

for( i = 7; i >= 0; i--)
              printf("%d ", n1>>i & 0x01);
printf("\n");

 

 

시프트 이동 연산자

특징

- 속도를 요하는 프로그램에서 유용

- 여러번의 산술연산보다 한번의 비트 이동이 속도면에서 효율적

 

<< : left shift 연산자

- 변수의 모든 비트를 왼쪽으로 integer-bits만큼 이동하고 오른쪽은 0으로 채움

- 수에 2를 곱한 것과 동일

 

>> : right shift 연산자

- 변수의 모든 비트를 오른쪽으로 integer-bits만큼 이동하고 왼쪽은 0으로 채움(음수는 1)

- 수에 2를 나눈 것과 같음

 

활용 : 시프트 이동 연산자를 이용하여 여러 바이트를 하나의 값으로 연결

#include <stdio.h>

int main()
{
	char x = 'A', y = 'B';
	short int z = 0x6162;
	long int N = 0;

	// 원하는 내용만 추출할 수 있어 61(a) / 62(b)
	printf("%c %c %c %c \n", x, y, (char)(z>>8), (char)z);

	// 흩어져있는 내용 모을 수 있어~ (AB6162)
	N = x;
	N = N << 24;
	N += (long int) y << 16;
	N += z;

	printf("%x \n", N);

	return 0;
}

A B a b
41426162

 


 

 

 

 

궁금한 사항은 댓글로 남겨주세요💃💨💫
좋아요와 구독(로그인X)은 힘이 됩니다 🙈🙉

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️