여러가지 비트 연산
최하위 비트 구하기
: 2의 보수의 특징을 활용함.
[연산 방법]
1
|
num & (-num)
|
cs |
[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
int main()
{
//0000 1010
int num = 10;
//0000 0010
int result = num & (-num);
//output
printf("%d\n", result);
return (0);
}
|
cs |
다음 비트가 처음으로 0이 나오는 자리 구하기
[연산 방법]
1
|
((num ^ (num + 1)) + 1) / 4
|
cs |
*중간에 0이 없을 경우 최상위 비트를 반환함.
[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
int main()
{
//1010 0011
int num = 163;
//0000 0010
int result = ((num ^ (num + 1)) + 1) / 4;
//output
printf("%d\n", result);
return (0);
}
|
cs |
n번째 비트가 1인지 0인지 구하기
[연산 방법]
1
|
if (num & (1 << n))
|
cs |
* 최하위 비트를 0번째라고 가정.
[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h>
int main()
{
//0001 1000
int num = 24;
if (num & (1 << 0))
printf("0번째 비트는 1입니다.\n");
else
printf("0번째 비트는 0입니다.\n");
if (num & (1 << 3))
printf("3번째 비트는 1입니다.\n");
else
printf("3번째 비트는 0입니다.\n");
return (0);
}
|
cs |
n번째 비트를 0으로 바꾸기
[연산 방법]
1
|
num &= ~( 1 << n )
|
cs |
[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
int main()
{
//0001 1000
int num = 24;
//0001 0000
num &= ~(1 << 3);
//output
printf("%d\n", num);
return (0);
}
|
cs |
n번째 비트를 1로 바꾸기
[연산 방법]
1
|
num |= (1 << n)
|
cs |
[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
int main()
{
//0001 1000
int num = 24;
//0001 1100
num |= (1 << 2);
//output
printf("%d\n", num);
return (0);
}
|
cs |
최상위 비트 구하기
[연산 방법]
1
2
3
4
5
6
7
8
|
int cnt = -1;
while (1)
{
if (num == 0)
break ;
num /= 2;
cnt++;
}
|
cs |
* cnt가 -1일 경우(num이 0일 경우)에 대한 예외처리가 필요함.
[예제 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
int main()
{
//0110 1110
int num = 110;
int cnt = -1;
while (1)
{
if (num == 0)
break ;
num /= 2;
cnt++;
}
//output
//0100 0000
printf("%d\n", 1 << cnt);
return (0);
}
|
cs |
'알고리즘 > 알고리즘' 카테고리의 다른 글
비트마스크 (0) | 2021.03.05 |
---|---|
[알고리즘] 탐욕 알고리즘 Greedy (0) | 2020.09.22 |
[탐색] Lower Bound와 Upper Bound (0) | 2020.08.07 |
[탐색] 이분 탐색 Binary Search (0) | 2020.08.06 |