기초 λΉ„νŠΈ μ—°μ‚°
Β - Last update: 2023-05-18

λΉ„νŠΈμ—°μ‚°μ˜ μ„Έκ³„λŠ” 끝도 μ—†μ§€λ§Œ, 기초적인 것뢀터 ν•˜λ‚˜μ”© 보닀보면 νŠΉμ„±μƒ μ΄ν•΄ν•˜μ§€ λͺ»ν•  것도 μ—†λ‹€. network flowλ₯Ό λͺ¨λ₯Όμ§€λΌλ„ λΉ„νŠΈμ—°μ‚°μ€ 계속 보닀보면 적응이 되기 λ•Œλ¬Έ.

기초 Reminder

μ‹œμž‘ν•˜κΈ°μ— μ•žμ„œ, remind μ°¨μ›μ—μ„œ 2μ§„μˆ˜ 1011이 μ–΄λ–»κ²Œ 10μ§„μˆ˜λ‘œ λ³€ν™˜λ˜λŠ”μ§€λ₯Ό μƒκΈ°ν•΄λ³΄μž.

1011
1 * 2^30 * 2^21 * 2^11 * 2^0
8021

μœ„ 과정을 거쳐 1011은 11둜 λ³€ν™˜λœλ‹€. 이 κ³Όμ •μ—μ„œ λ³Ό 수 μžˆλŠ” κ²ƒμ²˜λŸΌ, λ§Œμ•½ 전체 셀이 쒌츑으둜 1μΉΈ μ΄λ™ν•˜κ²Œ λœλ‹€λ©΄, 이 μˆ˜μ— 2λ₯Ό κ³±ν•œ 것과 같은 κ²°κ³Όλ₯Ό λ‚³λŠ”λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

10110
1 * 2^40 * 2^31 * 2^21 * 2^10 * 2^0
160420

즉, 이 μˆ˜λŠ” 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μ§„μˆ˜ ν‘œν˜„

μœ„μ— 잠깐 μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ, 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μžλ¦¬κ°€ ν•˜λ‚˜λ‘œ 묢이기 λ•Œλ¬Έμ—, ν‘œν˜„μ΄ κΈΈμ§€ μ•Šκ³  κ°„λ‹¨ν•˜κ²Œ λœλ‹€λŠ” μž₯점이 μžˆλ‹€.

2의 보수

이 뢀뢄에 λŒ€ν•œ 언급을 μŠ€ν‚΅ν•˜λ©΄ λ’€μͺ½μ—μ„œ λ‹€λ£¨κ²Œ 될 Trickyν•œ λΉ„νŠΈμ—°μ‚° 방법듀을 μ΄ν•΄ν•˜κΈ° μ–΄λ €μ›Œμ§€κΈ° λ•Œλ¬Έμ— 짚고 λ„˜μ–΄κ°ˆ ν•„μš”κ°€ μžˆκ² λ‹€.

  • μž‘μ„± 쀑

Tricky ν•œ λΉ„νŠΈ 닀루기

μ΅œν•˜μœ„ λΉ„νŠΈ 끄기

ν”νžˆ νŒ¬μœ… νŠΈλ¦¬μ—μ„œ 많이 μ“°μ΄λŠ” 기법이닀. μ•„λž˜μ™€ 같이 ν˜ΈμΆœν•˜λ©΄, 맨 ν•˜μœ„ 1λΉ„νŠΈκ°€ 1 -> 0으둜 λ°”λ€Œκ²Œ λœλ‹€.

v -= v & -v;

μœ„μ—μ„œ 2의 보수 와 κ΄€λ ¨ν•΄ 닀룬 것과 연관이 μžˆλ‹€. -vλ₯Ό ν•˜λŠ” μˆœκ°„ 전체 λΉ„νŠΈκ°€ λ°˜μ „λ˜λ©°, 1이 더해진닀. 이와 & 연산을 ν•˜κ²Œλ˜λ©΄, 맨 ν•˜μœ„ λΉ„νŠΈλ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ 0이 됨을 μ•Œ 수 μžˆλ‹€.

그런데 μœ„ 방법 말고 operation μˆ˜κ°€ 더 적은 방식도 μ‘΄μž¬ν•œλ‹€.

v = v & (v-1);

μœ„ 방식은 μ΄μ§„μˆ˜ λΊ„μ…ˆμ˜ νŠΉμ„±μ„ μ΄μš©ν•œ λ°©μ‹μœΌλ‘œ, 1을 λΊ„ 경우 μ΅œν•˜μœ„ 1 λΉ„νŠΈκ°€ 0으둜 λ°”λ€Œκ³  κ·Έ μ•„λž˜ λΉ„νŠΈκ°€ 1둜 λ°”λ€λ‹€λŠ” 사싀을 μ΄μš©ν•œλ‹€. λΆ€ν˜Έλ°”κΏˆ 연산을 μ ˆμ•½ν•  수 μžˆλŠ” 방식이닀.

🏷️ 주제 λͺ©λ‘: