Computer Science/Algorithms

[알고리즘][비트연산] 2. 비트 스왑

iseop 2023. 5. 28. 16:17   인쇄용 버전

문제: 임의의 64비트 수 x의 i번째 비트와 j번째 비트를 교환하라. (0 ≤ i, j ≤ 63)

 

일반적인 배열 내에서 특정 위치의 값들을 스왑하기 위해서는 그 값을 저장할 변수가 필요하다. 그러나 비트는 어차피 0과 1밖에 없기 때문에, 두 위치의 비트가 다를 때만 해당 위치들의 비트를 반전시켜주면 문제를 상수 시간 내에 해결할 수 있다.

 

public static long swap(long x, int i, int j) {
	if (((x >>> i) & 1) != ((x >>> j) & 1)) {
    	x ^= 1L << i;
        x ^= 1L << j;
    }
    return x;
}