Bitwise Operation
문제1 : bitwise and, or, xor, not
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
int x = 10;
int y = 200;
int z;
z = x & y;
z = x | y;
z = x ^ y;
z = ~x;
printf("%d \n", z); printf("%02X,\n", z);
// ...
}
문제 2 : XOR를 이용하는 두 개의 변수 (a,b) → (b,a) swapping
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
int a = 10;
int b = 200;
printf("%d %d\n", a, b);
a = a ^ b; b = a ^ b; a = a ^ b;
printf("%d %d\n", a, b);
// ...
}
결과
문제 3 : bitwise &를 이용하는 image masking : grayscale Lenna
x & 0xF0 >> pixel의 4개의 LSB bit를 0으로 한다.
x & ? >> pixel의 4개의 MSB bit를 0으로 한다.
정답
?는 0x0F
문제 4 : ~x을 이용한 Inverse image 만들기 : grayscale Lenna
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
for (int i = 0; i < Height; i++) {
for (int j = 0; j < Width; j++) {
*(YBuf + i * Width + j) = ~*(YBuf + i * Width + j);
}
}
// ...
}
결과
문제 5 : bitshift로 image의 brightness 조절 : grayscale Lenna
1. X >> 1 (우측으로 1bit씩 이동) : pixel값이 2배 어두어짐
2. X << 1 (좌측으로 1bit씩 이동) : pixel 값이 2배 밝아짐
int output_1D[16] = {0, };
3. NNI. 좌표값은 반올림해 역방향 사상으로 각 출력 배열의 원소를 채운다. (overflow 처리 필요함)
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
for (int i = 0; i < Height; i++) {
for (int j = 0; j < Width; j++) {
BYTE xb = *(YBuf + i * Width + j);
// int yy = xb << 1;
int yy = xb >> 1;
if (yy > 255) yy = 255;
if (yy < 0) yy = 0;
*(YBuf + i * Width + j) = yy;
}
}
// ...
}
결과
문제 6 : XOR을 이용하여 image에서 특정 값을 가지는 pixel을 0으로 함
1. 두 개의 값이 같으면, XOR 는 0이 되는 특성을 활용
2. Grayscale Lenna에서 특정값 key를 가지는 pixel을 찾아서 black으로 filling한다.
3. key=123이면 pixel 값에 (x^key)을 적용하면, 123을 가지는 pixel은 0으로 된다.
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
for (int i = 0; i < Height; i++) {
for (int j = 0; j < Width; j++) {
BYTE x = *(YBuf + i * Width + j);
BYTE key = 123;
if ((x ^ key) == 0x00)
{
*(YBuf + i * Width + j) = (BYTE)0x00;
}
}
}
// ...
}
결과
문제 7 : XOR을 이용하는 Image 암호화 : grayscale Lenna 이용
1. 암호화(encryption) : 입력 image → key로 XOR 적용 → 출력영상 ⓵
2. 복호화(decryption) : 출력영상 ⓵ → key로 XOR 적용 → 출력영상 ⓶ (=입력 image)
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
memcpy(Out, YBuf, Width * Height * 3);
char key = 0x2F;
for (int i = 0; i < Height; i++) {
for (int j = 0; j < Width; j++) {
*(Out + i * Width + j) = *(YBuf + i * Width + j) ^ key;
*(YBuf + i * Width + j) = *(Out + i * Width + j) ^ key;
}
}
// ...
}
결과
문제 8 : Hamming Distance
두 데이터 A, B 의 Hamming Distance(HD)는 xor에서 set bit=1의 개수임.
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
int x = 64;
int y = 5;
int z = x ^ y;
int HD = 0;
while (z > 0)
{
HD += z & 0x1;
z >>= 1;
}
printf(" HD : %d \n", HD);
// ...
}
결과
문제 9 : byte append 하여 bitstream 만들기
a = [FF F2 A3], b = [F2 2F] 일 때, c = [a, b] = [FF F2 A3 F2 2F]을 만든다.
정답 코드
#include <iostream>
// ...
int main(void)
{
// ...
BYTE a[] = { 0xFF, 0xF2, 0xA3 };
BYTE b[] = { 0xF2, 0xF2 };
int aL = sizeof(a) / sizeof(a[0]);
int bL = sizeof(b) / sizeof(b[0]);
int totalLength = aL + bL;
BYTE* result = (BYTE*)malloc(totalLength);
memset(result, 0x00, totalLength);
memcpy(result, a, aL);
memcpy(result + aL, b, bL);
for (int i = 0; i < totalLength; i++)
printf(" %02X ", result[i]);
printf("\n");
free(result);
// ...
}
결과
'공부 > 영상통신' 카테고리의 다른 글
[영상통신] 압축 기술 (0) | 2024.12.15 |
---|---|
[영상통신] 영역처리 (0) | 2024.12.15 |
[영상통신] Pixel 처리 (0) | 2024.12.15 |