hyunjin

[C++][비트 단위 논리 연산] 1059~ 보수 , ~, & ,| ,^, << ,>> 본문

알고리즘 연습/코드업

[C++][비트 단위 논리 연산] 1059~ 보수 , ~, & ,| ,^, << ,>>

_h.j 2020. 9. 4. 12:47
728x90

[1059] 비트단위 연산자로 NOT하여 출력

#include <bits/stdc++.h>

using namespace std;
int main(){
	int a;
	scanf("%d",&a);
	cout<< ( ~a);
	return 0;
}

2에 비트 연산자인 ~(틸다)를 사용하면 -3이 된다.

 

※주의!!!   !는  참 거짓을 나타내는 논리 연산자

 

<2의 보수 표현>

-n = ~n +1

n = ~(-n-1)

10진수 2진수 10진수  2진수
1 0001 -1 1111 
    -2 1110

 

4bit에서 -8 ~ 7까지 표현 가능

 

 

 

[1060] &

#include <bits/stdc++.h>

using namespace std;
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	cout<< (a & b);
	return 0;
}

10진으로 출력된다.

10진 <-> 2진 출력 바로 되는 함수는 없을까? 찾아보니 있다.

C++카테고리에 정리해놔야겠다.

 

숫자간 비트 단위로 & 연산하는 것은 ip 주소 연산하는 것에도 쓰인다.

실제로 네트워크에 연결되어 있는 두 개의 컴퓨터가 데이터 주고 받기 위해

같은 네트워크에 있는지 아닌지 판단하는데 사용된다고 한다.

=>비트 연산을 이용하면 어떤 비트열의 특정 부분만 모두 0으로 만들 수 있기 때문

 

192.168.0.31   : 11000000.10101000.00000000.00011111
255.255.255.0 : 11111111.11111111.11111111.00000000

 & 연산하면 특정 부분만 모두 0으로 바꿀 수 있다.

 

비트 단위 연산은 빠른 계산이 필요한 그래픽 처리에서 마스크 연산 수행하는데 효과적

 

 

 

[1061] |

#include <bits/stdc++.h>

using namespace std;
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	cout<< (a | b);
	return 0;
}

 

 

[1062] 비트단위 XOR  :  ^

#include <bits/stdc++.h>

using namespace std;
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	cout<< (a ^ b);
	return 0;
}

XOR (배타적 논리합): 서로 다를 때 1

^를 다른 연산자들의 조합으로 나타내보자.

a^b = ~(a&b) & (a|b)  

cout<< ~(a&b) & (a|b) ;

근데 왜 에러가 날까 ????

 

728x90