알고리즘 연습/코드업
[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