λΉνΈμ°μ°μ μΈκ³λ λλ μμ§λ§, κΈ°μ΄μ μΈ κ²λΆν° νλμ© λ³΄λ€λ³΄λ©΄ νΉμ±μ μ΄ν΄νμ§ λͺ»ν κ²λ μλ€. 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 = 0b11111111111111111111111111111111
0x55555555 = 0b01010101010101010101010101010101
0x33333333 = 0b00110011001100110011001100110011
0xAAAAAAAA = 0b10101010101010101010101010101010
μ κ°μ κ²λ€μ΄ μλ€. 보μ΄λλλ‘ 4μλ¦¬κ° νλλ‘ λ¬Άμ΄κΈ° λλ¬Έμ, ννμ΄ κΈΈμ§ μκ³ κ°λ¨νκ² λλ€λ μ₯μ μ΄ μλ€.
μ΄ λΆλΆμ λν μΈκΈμ μ€ν΅νλ©΄ λ€μͺ½μμ λ€λ£¨κ² λ Trickyν λΉνΈμ°μ° λ°©λ²λ€μ μ΄ν΄νκΈ° μ΄λ €μμ§κΈ° λλ¬Έμ μ§κ³ λμ΄κ° νμκ° μκ² λ€.
νν ν¬μ νΈλ¦¬μμ λ§μ΄ μ°μ΄λ κΈ°λ²μ΄λ€. μλμ κ°μ΄ νΈμΆνλ©΄, 맨 νμ 1λΉνΈκ° 1 -> 0μΌλ‘ λ°λκ² λλ€.
v -= v & -v;
μμμ 2μ 보μ
μ κ΄λ ¨ν΄ λ€λ£¬ κ²κ³Ό μ°κ΄μ΄ μλ€. -vλ₯Ό νλ μκ° μ 체 λΉνΈκ° λ°μ λλ©°, 1μ΄ λν΄μ§λ€. μ΄μ & μ°μ°μ νκ²λλ©΄, 맨 νμ λΉνΈλ₯Ό μ μΈνκ³ λ λͺ¨λ 0μ΄ λ¨μ μ μ μλ€.
κ·Έλ°λ° μ λ°©λ² λ§κ³ operation μκ° λ μ μ λ°©μλ μ‘΄μ¬νλ€.
v = v & (v-1);
μ λ°©μμ μ΄μ§μ λΊμ μ νΉμ±μ μ΄μ©ν λ°©μμΌλ‘, 1μ λΊ κ²½μ° μ΅νμ 1 λΉνΈκ° 0μΌλ‘ λ°λκ³ κ·Έ μλ λΉνΈκ° 1λ‘ λ°λλ€λ μ¬μ€μ μ΄μ©νλ€. λΆνΈλ°κΏ μ°μ°μ μ μ½ν μ μλ λ°©μμ΄λ€.