Delta Swap의 간단한 설명

4213 단어 비트 연산

우선: Delta Swap이란?


어떤 비트레이트에서, 이 비트레이트의 일부 비트레이트 (연속하지 않을 수 있음) 는 같은 모양으로 덮어쓰지 않은 두 그룹의 변환 작업이 없습니다.

이것은 아래 코드로 실현할 수 있다.
delta_swap.cpp
typedef unsigned long long ull;
ull delta_swap(ull x, ull mask, int delta) {
    ull t = (x >> delta) ^ x & mask;
    return t ^ (t << delta) ^ x;
}
x는 대상의 비트레이트이고 mask는 바꾸고 싶은 2조 부분의 비트레이트 중 하위에 있는 쪽이 차지하는 비트는 모두 1로 채웠다.
mask와mask<이 문장에서 나는 이 코드를 이해하는 방법을 쓸 것이다.

전제 지식(?)


위의 코드를 이해하려면 한눈에 당연한 다음 항등식이 중요하다.
delta_swap.cpp
A ^ B ^ B = A
순서를 바꿔도 똑같아요.
delta_swap.cpp
(B ^ A) ^ B = A
이것을 이용하면 임시 변수를 사용하지 않는 두 변수의 swap을 쓸 수 있습니다.
delta_swap.cpp
// A, Bはリテラルの意味で、C, Dは変数の意味で使います
// C, Dの中身を入れ替えます
// 最初CにはA, DにはBが入っているとします。
C ^= D; // CにA^Bが入る
D ^= C; // DはB^(A^B), すなわちAが入る
C ^= D; // (A^B)^A, すなわちB

주제: Delta Swap 설명


먼저
delta_swap.cpp
ull t = (x >> delta) ^ x & mask;
교환하고 싶은 비트꼬치 두 개를 만든 xor라고 할 수 있습니다.

그러므로
delta_swap.cpp
return t ^ (t << delta) ^ x;
이해할 수 있는 것은 원래의 비트레이트 x에서 x나 x라면 (일본어는 혼란스러운) 비트레이트의 swap이 된다는 것이다.끝.

최후


그림이 더럽다.

좋은 웹페이지 즐겨찾기