λΉνΈμ°μ°μ μΈκ³λ λλ μμ§λ§, κΈ°μ΄μ μΈ κ²λΆν° νλμ© λ³΄λ€λ³΄λ©΄ νΉμ±μ μ΄ν΄νμ§ λͺ»ν κ²λ μλ€. network flowλ₯Ό λͺ¨λ₯Όμ§λΌλ λΉνΈμ°μ°μ κ³μ 보λ€λ³΄λ©΄ μ μμ΄ λκΈ° λλ¬Έ.
μμνκΈ°μ μμ, remind μ°¨μμμ 2μ§μ 1011μ΄ μ΄λ»κ² 10μ§μλ‘ λ³νλλμ§λ₯Ό μκΈ°ν΄λ³΄μ.
| 1 | 0 | 1 | 1 |
|---|---|---|---|
| 1 * 2^3 | 0 * 2^2 | 1 * 2^1 | 1 * 2^0 |
| 8 | 0 | 2 | 1 |
μ κ³Όμ μ κ±°μ³ 1011μ 11λ‘ λ³νλλ€. μ΄ κ³Όμ μμ λ³Ό μ μλ κ²μ²λΌ, λ§μ½ μ 체 μ
μ΄ μ’μΈ‘μΌλ‘ 1μΉΈ μ΄λνκ² λλ€λ©΄, μ΄ μμ 2λ₯Ό κ³±ν κ²κ³Ό κ°μ κ²°κ³Όλ₯Ό λ³λλ€λ κ²μ μ μ μλ€.
| 1 | 0 | 1 | 1 | 0 |
|---|---|---|---|---|
| 1 * 2^4 | 0 * 2^3 | 1 * 2^2 | 1 * 2^1 | 0 * 2^0 |
| 16 | 0 | 4 | 2 | 0 |
μ¦, μ΄ μλ 11*2 = 22μ κ²°κ³Όκ° κ°μμ§λ€. μ΄λ₯Ό μ½λλ‘ κ΅¬νν΄μ 2μ μ κ³±μλ₯Ό κ³±νλ μ½λλ₯Ό ꡬννλ©΄ μλμ²λΌ λλ€.
int get2powermultiply(int v, int pow2) {return v << pow2;}
λν, 맨 μ°μΈ‘μ μλ§μ΄ 1μ λνλ΄λ―λ‘, νμμΌ κ²½μ°μ 맨 μ°μΈ‘μ μλ νμ 1μ΄ λ¨λ λ©λ¬μ μ μ μλ€. κ·Έλμ, νμ νμ λ‘μ§μ μλμ κ°μ΄ μ§€ μ μλ€.
bool isOdd(int v) {return v & 1;}
C++μμ 1 = 0b00000...0001κ³Ό κ°λ€. μ¦, & μ°μ°μ μ·¨νλ©΄ LSBμΈ λ§¨ μ΅νμ λΉνΈλ§ λ¨κ² λλ€. μ¬κΈ°μ 0b000..000κ³Ό κ°μ νκΈ°λ²μ μ κΉ μ§κ³ λμ΄κ°μ.
μμ μ κΉ μΈκΈν κ²μ²λΌ, C++μμλ 2μ§μλ₯Ό νννκΈ° μν΄ prefixμΈ 0bλ₯Ό λΆμΈλ€. μ΄κ²μ λΆμμΌλ‘μ¨ μ»΄νμΌλ¬νν
λ΄κ° μμΌλ‘ μ°λ μ«μκ° 10μ§λ²μ΄ μλλΌ 2μ§λ²μ΄λΌλ μκ·Έλμ μ£Όλ κ²μ΄λ€. μ μν μ μ, μ΄κ²μ΄ μλ£νκΉμ§ μ΄μνμ§λ μλλ€λ κ²μ΄λ€. νν μ°μ΄λ 32bit μμ€ν
μμλ int μλ£ν κΈ°μ€μΌλ‘ 32bitκΉμ§ μ¬μ©ν μ μλ€. κ·Έλ¦¬κ³ , μΌλ°μ μΌλ‘ intλ λΆνΈμλ μλ£ν μ·¨κΈμ λ°κΈ° λλ¬Έμ κ·Έλ₯ intλ₯Ό μ¬μ©νκ² λλ©΄ shiftμ°μ° λ±μμ μ‘°κΈ ν·κ°λ¦΄ μ μλ€. κ·Έλμ κ°κΈμ λΉνΈμ°μ°μ ν κ²½μ°μλ λΆνΈμλ μλ£νμΈ unsigned intλ₯Ό μ¬μ©νλ κ²μ μΆμ²νλ€.
λν, κ³ μΈλ¬Όλ€μ 2μ§μ ννμΌλ‘ 2μ§μλ₯Ό μ°μ§ μλλ€. λ¬΄μ¨ λ§μΈκ° νλ©΄, μλμ κ°μ 16μ§μλ₯Ό μ°κ³€ νλ€λ κ²μ΄λ€.
constexpr unsigned int flipbit = 0x55555555;
0xλ‘ μμνλ κ²½μ° 16μ§μλ₯Ό λ»νλ€. 16μ§μλ 16 = 2^4μ΄λ―λ‘, 2μ§μμ μ리μλ³λ‘ 1:4 λ§€νμ΄ λλ€. 0x5λΌκ³ μ΄ κ²μ, 0b0101μ μλ―Ένλ€. 0xFλΌκ³ μ΄ κ²μ 0b1111μ μλ―Ένλ€. μ΄λ κ² κ³ μ΄κ² λλ©΄, κ·Έλ₯ 16μ§μλ§ λ΄λ 2μ§μλ₯Ό 보λ κ²½μ§μ μ΄λ₯Έλ€. μ΄κ² κ΅³μ΄ νμν μ΄μ λ? 2μ§μλ‘ μ°λ©΄ λ§€μ° κΈΈμ΄μ§λ κ²λ€μ΄ κ°λ¨νκ² μ¨μ§κΈ° λλ¬Έμ΄λ€. μλ₯Ό λͺκ°μ§ λ€λ©΄
0xFFFFFFFF = 0b111111111111111111111111111111110x55555555 = 0b010101010101010101010101010101010x33333333 = 0b001100110011001100110011001100110xAAAAAAAA = 0b10101010101010101010101010101010μ κ°μ κ²λ€μ΄ μλ€. 보μ΄λλλ‘ 4μλ¦¬κ° νλλ‘ λ¬Άμ΄κΈ° λλ¬Έμ, ννμ΄ κΈΈμ§ μκ³ κ°λ¨νκ² λλ€λ μ₯μ μ΄ μλ€.
μ΄ λΆλΆμ λν μΈκΈμ μ€ν΅νλ©΄ λ€μͺ½μμ λ€λ£¨κ² λ Trickyν λΉνΈμ°μ° λ°©λ²λ€μ μ΄ν΄νκΈ° μ΄λ €μμ§κΈ° λλ¬Έμ μ§κ³ λμ΄κ° νμκ° μκ² λ€.
νν ν¬μ νΈλ¦¬μμ λ§μ΄ μ°μ΄λ κΈ°λ²μ΄λ€. μλμ κ°μ΄ νΈμΆνλ©΄, 맨 νμ 1λΉνΈκ° 1 -> 0μΌλ‘ λ°λκ² λλ€.
v -= v & -v;
μμμ 2μ 보μ μ κ΄λ ¨ν΄ λ€λ£¬ κ²κ³Ό μ°κ΄μ΄ μλ€. -vλ₯Ό νλ μκ° μ 체 λΉνΈκ° λ°μ λλ©°, 1μ΄ λν΄μ§λ€. μ΄μ & μ°μ°μ νκ²λλ©΄, 맨 νμ λΉνΈλ₯Ό μ μΈνκ³ λ λͺ¨λ 0μ΄ λ¨μ μ μ μλ€.
κ·Έλ°λ° μ λ°©λ² λ§κ³ operation μκ° λ μ μ λ°©μλ μ‘΄μ¬νλ€.
v = v & (v-1);
μ λ°©μμ μ΄μ§μ λΊμ μ νΉμ±μ μ΄μ©ν λ°©μμΌλ‘, 1μ λΊ κ²½μ° μ΅νμ 1 λΉνΈκ° 0μΌλ‘ λ°λκ³ κ·Έ μλ λΉνΈκ° 1λ‘ λ°λλ€λ μ¬μ€μ μ΄μ©νλ€. λΆνΈλ°κΏ μ°μ°μ μ μ½ν μ μλ λ°©μμ΄λ€.