#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0011 1100 */
NSLog(@"a & b : %d",c);
c = a | b; /* 61 = 0011 1101 */
NSLog(@"a | b : %d",c);
c = a ^ b; /* 49 = 0011 0001 */
NSLog(@"a ^ b : %d",c);
c = ~a; /*-61 = 1100 0011 */
NSLog(@" ~a : %d",c);
c = a << 2; /*240 = 1111 0000 */
NSLog(@"a << 2: %d",c);
c = a >> 2; /* 15 = 0000 1111 */
NSLog(@"a >> 2: %d",c);
}
return 0;
}
비트 연산 쉬프트 연산
[C++] 비트 연산과 쉬프트 (>>, <<)
1. 비트 연산
비트 단위 연산자(Bitwise Operators)는 비트의 수준에서 정보를 조작할 수 있게 해준다.
일반적으로 자주 사용하지는 않지만 화상이나 음성, 압축한 정보들을 다룰 때는 요긴한 기능이다.
비트 관점에서의 정보는 2진수로 표현된다.
실제 프로그래밍에서는 2진수로의 변환이 용이한 16진수를 많이 사용한다.
따라서 2진수, 10진수, 16진수의 관계와 변환을 알고 있어야 한다.
2진수와 10진수의 변환은 쉬울 것이다.
16진수에서 10진수 그리고 반대는 한번에 변환하기가 쉽지 않다
따라서 2진수로 변환 단계를 거치면 쉬워진다.
2진수를 16진수로 변환할 때는 4자리씩 묶어서 표시하면 된다.
2진수 : 1010110101
-> 뒤에서 4자리씩 묶고 모자라는 자리는 0으로 채운다.
2진수 : (0010) (1011) (0101)
16진수 : 2 B 5
16진수에서 2진수로의 변환도 역으로 4자리씩 풀어내면 된다.
* 정수 값을 2진수로 출력
#include <bitset> #include <iostream> using namespace std; int main(){ char c = 1; // 8비트 short int si = 2; // 16비트 int i = 4; // 32비트 cout << "c= " << bitset<8>(c) << "(" << (int)c << ")" << endl; cout << "si= " << bitset<16>(si) << "(" << si << ")" << endl; cout << "i= " << bitset<32>(i) << "(" << i << ")" << endl; return 0; } |
bitset 은 2진수 bit로 출력한다.
2. 비트 단위 논리 연산자
비트 단위 논리 연산자는 피연산자의 각 비트에 대해서 논리 연산을 수행한다.
피연산자1 | 피연산자2 | 결과 | ||
AND(&) | OR(|) | XOR(^) | ||
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
3. 쉬프트 연산자
쉬프트 연산(Shift Operation)이란 비트를 몇 칸씩 옆으로 이동하는 연산을 말한다.
green >> 5; -> green 변수의 값을 오른쪽으로 5비트 이동시킨다.
ex>
green : 0000001000100000
green >> 5 : 0000000000010001
반대로 << 는 왼쪽으로 비트를 이동한다
비트가 이동하면서 새롭게 채워지는 비트들은 0으로 채워진다.
하지만 음수의 값을 오른쪽으로 쉬프트 할 때는 1이 채워진다.
출처: http://hyeonstorage.tistory.com/307 [개발이 하고 싶어요]
연 산 자 | 설 명 | 예 |
& | 이진법의 AND 연산자로 연산의 대상이 되는 양쪽 수치가 모두 1인 경우 1을 반환합니다. | A & B |
| | 이진법의 OR 연산자로 피연산자 중 최소 한쪽이 1이면 1을 반환합니다. | A | B 0011 1100 = 60 0000 1101 = 13 —————- 0011 1101 = 61 |
^ | 이진법의 XOR 연산자로 양쪽의 피연산자가 다를 경우에 1을 반환합니다. | A ^ B 00111100 = 60 00001101 = 13 —————- 00110001 = 49 |
~ | 이진법의 NOT 연산자로 모든 비트의 값을 반대로 바꿉니다. | ~A 0011 1100 = 60 —————- 1100 00011=-61 |
<< | 이진법의 왼쪽 시프트 연산자로 왼쪽 피연산자를 오른쪽 피연산자의 비트 숫자 만큼 왼쪽으로 이동시킵니다. | A << 2 0011 1100 = 60 —————- 1111 0000=240 |
>> | 이진법의 오른쪽 시프트 연산자로 왼쪽 피연산자를 오른쪽 피연산자의 비트 숫자 만큼 오른쪽으로 이동시킵니다. | A >> 2 0011 1100 = 60 —————- 0000 1111 = 15 |