알고리즘/알고리즘

여러가지 비트 연산

sujo 2021. 9. 30. 22:39

여러가지 비트 연산

 

최하위 비트 구하기

: 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