2์ง์ ํํ์์ 1์ ๊ฐ์๋ ์ผ๋ฐ์ ์ผ๋ก 2๋ก ๋๋์ด์ฃผ๊ณ , ๊ทธ ๋๋จธ์ง๋ฅผ ์นด์ดํ ํ๋ฉฐ ์ ์ ์๋ค. ์๊ฐ๋ณต์ก๋ $O(logN)$
def func(N):
cnt = 0
while N:
cnt += N % 2
N //= 2
return cnt
bitwise ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ์ ์ฌํ ๋ฐฉ๋ฒ์ผ๋ก 1์ ๊ฐ์๋ฅผ ์ ์ ์๋ค. ์ฃผ์ด์ง ์ N์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๋นํธ๊ฐ 1์ธ์ง ํ์ธํ๊ณ , N์ ํ๋์ฉ right shiftํ๋ฉด์ 1์ ๊ฐ์๋ฅผ ์ผ๋ค. ์ด๋ N์ ๋นํธ์๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ์๊ฐ๋ณต์ก๋ $O(logN)$
def func(N):
cnt = 0
while N:
cnt += N & 1 # ํ์ฌ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๋นํธ๊ฐ 1์ธ์ง ํ์ธ
N >>= 1 # N์ ์ค๋ฅธ์ชฝ์ผ๋ก 1 ๋นํธ์ฉ ์ด๋ํ์ฌ ๋ค์ ๋นํธ ํ์ธ
return cnt
์ด๋ณด๋ค ๋ ๋์ ๋ฐฉ๋ฒ์ Brian Kernighan์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฉ์์ด๋ค. N = N & (N-1)
์ ๋ฐ๋ณตํ๋ฉด์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๋นํธ๋ฅผ ์ ๊ฑฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์๋ฅผ ์ผ๋ค. N์ ์ด์ง์๋ก ๋ํ๋ด์์ ๋ 1์ ๊ฐ์๋งํผ ๋ฐ๋ณตํ๋ฏ๋ก, ์ด์ง ํํ์์ 1์ด ์ ์ ๊ฒฝ์ฐ ์ ๋ ๊ฒฝ์ฐ๋ณด๋ค ๋ ๋น ๋ฅด๋ค. ์๊ฐ๋ณต์ก๋ $O(k)$ (k๋ 1์ ๊ฐ์)
def func(N):
cnt = 0
while N:
N = N & (N-1)
cnt += 1
return cnt
์๋ํด ๋ณธ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒ์ ํ์ด์ฌ์ bin
๋ด์ฅํจ์๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๋ค. ๋ด๋ถ์ ์ธ ์ต์ ํ๋ก ์ธํด ์คํ ์๊ฐ์ด ๋๋จธ์ง ์ธ ๋ฐฉ๋ฒ๋ณด๋ค ๊ฐ์ฅ ๋นจ๋๋ค.
def func(N):
binary = bin(N)[2:] # 2์ง์๋ก ๋ณํ ํ 'Ob' ์ ๊ฑฐ
cnt = binary.count('1')
return cnt
๋ฐฑ์ค 2098: ์ธํ์ ์ํ ๋ฅผ ํ๋ค๊ฐ ์ ํ ๋นํธ๋ง์คํน ๊ฐ๋ ์ ๊ณต๋ถํ๋ฉด์, ๋ ํท๊ฐ๋ ธ๋ ๋นํธ ์ฐ์ฐ์ ๋ํด ์กฐ๊ธ ๋ ๊ณต๋ถํด๋ณผ ์ ์๋ ๊ธฐํ (์ฝ์น๋์ ํผ๋๋ฐฑ)๊ฐ ์๊ฒจ ์๊ฒ๋๋ง ํ๋ณด์๋ค.. ๋นํธ๋ง์คํน์ ์ด์ฉํด ๋ฐฉ๋ฌธํ ๋์ (0..N)๋ฅผ ๋ํ๋ผ ๊ฒฝ์ฐ ์ต๋ 63๊ฐ์ ๋์๊น์ง ๋ฐฉ๋ฌธ์ ์ฒดํฌํ ์ ์๋๋ฐ ์ด๋ ํ์ด์ฌ์์ ์ ์ํ์ด 8๋ฐ์ดํธ๊ธฐ ๋๋ฌธ์ด๋ค. 8๋ฐ์ดํธ๋ 64๋นํธ์ง๋ง ์์/์์๋ฅผ ๋ํ๋ด๋ ์ฌ์ธ ๋นํธ๊ฐ 1๋นํธ๋ฅผ ์ฐจ์งํ๋ฏ๋ก ์ต๋ 63๋นํธ๊น์ง๋ง ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๋นํธ์ฐ์ฐ์ |
&
<<
>>
์ ๋์ฑ ์ต์ํด์ง๊ณ ์ถ๋ค.. ๋นํธ ์ฐ์ฐ์ ์ ์ดํดํ๋ฉด ์ดํดํ ์๋ก, ์ปดํจํฐ์ ๋์ ๋ฐฉ์์ ๋ํด์๋ ์ ์ดํดํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. (ํ๋๊ฐ ๋ค๋ฅธ ํ๋์ ์์ธ์ด ๋๋ค๋ ๊ฒ์ด ์๋๊ณ ์ดํด๋๊ฐ ๊น์ด์ง๋ ๋ฐฉํฅ์ด ๊ฐ๋ค๋ ์๋ฏธ์์)
random_numbers = []
for _ in range(100):
num = random.randint(2**62, 2**63 - 1)
random_numbers.append(num)
์ ์ธํ์์ ์์๋๋ก ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฑ๋๋ค. 1์ ๋ด์ฅํจ์, 2๋ ์ปค๋ํธ, 3์ ๋๋๊ธฐ ๋ฐ๋ณต, 4๋ ๋นํธ ์ํํธ. ์๋ฌธ์ ์: 3๊ณผ 4๊ฐ ๋งค๋ฒ ๊ทผ์ฌํ์ง๋ง ๋ 3์ด 4๋ณด๋ค ๋น ๋ฅธ ์คํ์๊ฐ์ ๋ณด์๋๋ฐ, ๋นํธ ์ํํธ๋ณด๋ค ๋๋๊ธฐ๊ฐ ์ ๋ ์ฑ๋ฅ์ด ์ข์์ง๊ฐ ๊ถ๊ธํ๋ค. ๋ต์ ์ฐพ๊ฒ ๋๋ฉด ๋ง๋ถ์ฌ ๋์ด์ผ๊ฒ ๋ค.
func 1: 32, 0.00006 sec
func 2: 32, 0.00020 sec
func 3: 32, 0.00041 sec
func 4: 32, 0.00043 sec
'DevLog ๐จ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DevLog][PintOS] PRJ1 Threads/Scheduling Algorithms (0) | 2023.10.03 |
---|---|
[DevLog][PintOS] PRJ1 Threads/Priority Scheduling (0) | 2023.09.27 |
[DevLog][CSAPP] 10์ฅ ์์คํ ์์ค ์ ์ถ๋ ฅ (10.1~10.5) (0) | 2023.09.24 |
[DevLog][CSAPP] 9์ฅ 9.9 malloc lab ๋์ ํ ๋น๊ธฐ ๊ตฌํ (0) | 2023.09.24 |
[DevLog][CSAPP] 9์ฅ ๊ฐ์๋ฉ๋ชจ๋ฆฌ (9.1~9.4) (0) | 2023.09.10 |