Skip to content

Commit d57ce2a

Browse files
committed
DaleStudy#232 Number of 1 Bits
1 parent 6436e26 commit d57ce2a

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
solution 1. bit operation
3+
# Time Complexity: O(1)
4+
- n์˜ ์‚ฌ์ด์ฆˆ๋Š” 32 bit๋กœ ์ผ์ •
5+
- 2 * 32 ํšŒ ์—ฐ์‚ฐ ํ•„์š”
6+
# Space Complexity: O(1)
7+
8+
bit๋ฅผ ํ•˜๋‚˜์”ฉ ์„ผ๋‹ค.
9+
10+
11+
solution 2. bit operation (advanced)
12+
# Time Complexity: O(1)
13+
- 2 * b ํšŒ ์—ฐ์‚ฐ ํ•„์š” (b๋Š” 1์ธ bit์˜ ๊ฐœ์ˆ˜)
14+
# Space Complexity: O(1)
15+
16+
n &= (n - 1) ์—ฐ์‚ฐ์„ ํ†ตํ•ด, ๋งˆ์ง€๋ง‰ bit๋ฅผ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๋ฉด์„œ bit๋ฅผ ์„ผ๋‹ค.
17+
1์ธ bit์˜ ๊ฐœ์ˆ˜๋งŒํผ ์—ฐ์‚ฐ์„ ํ•˜๋ฏ€๋กœ, ํ‰๊ท ์ ์œผ๋กœ solution 1๋ณด๋‹ค๋Š” ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ์ ๋‹ค.
18+
19+
20+
solution 3. 8-bit chunk lookup table
21+
# Time Complexity: O(n)
22+
- n / 8 ํšŒ ์—ฐ์‚ฐ ํ•„์š”
23+
# Space Complexity: O(1)
24+
- 2^8 ์‚ฌ์ด์ฆˆ์˜ int ๋ฐฐ์—ด ์‚ฌ์šฉ
25+
26+
์ด์ง„์ˆ˜ 00000000 ~ 11111111 ์— ๋Œ€ํ•ด์„œ, ๊ฐ ์ˆ˜์— bit 1์ด ๋ช‡ ๊ฐœ ๋“ฑ์žฅํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ lookup table์— ์ €์žฅํ•ด๋‘”๋‹ค.
27+
๊ทธ๋ฆฌ๊ณ  n์„ 8 bit ๋‹จ์œ„๋กœ ์ž˜๋ผ์„œ, loopup table์—์„œ ์กฐํšŒํ•˜์—ฌ ๋ˆ„์ ํ•ด์ค€๋‹ค.
28+
์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ n / 8๋กœ ์ค„์–ด๋“ ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, lookup table์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„์— ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๊ณ , lookup table ์‚ฌ์ด์ฆˆ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ๋‹ค.
29+
30+
31+
solution 4. population count ์•Œ๊ณ ๋ฆฌ์ฆ˜
32+
# Time Complexity: O(1)
33+
- 5 ํšŒ ์—ฐ์‚ฐ ํ•„์š”
34+
# Space Complexity: O(1)
35+
36+
๊ฐ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค, 2, 4, 8, 16, 32 bit chunk ์•ˆ์˜ 1 bit์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.
37+
38+
39+
solution 5. ์ž๋ฐ” ๋‚ด์žฅ ํ•จ์ˆ˜ Integer.bitCount() ์‚ฌ์šฉ
40+
# Time Complexity: O(1)
41+
# Space Complexity: O(1)
42+
43+
*/
44+
class Solution {
45+
// solution 1
46+
// public int hammingWeight(int n) {
47+
// int ans = 0;
48+
// while (n > 0) {
49+
// ans += (n & 1);
50+
// n >>= 1;
51+
// }
52+
// return ans;
53+
// }
54+
55+
// solution 2
56+
// public int hammingWeight(int n) {
57+
// int ans = 0;
58+
// while (n > 0) {
59+
// n &= (n - 1); // ์ตœํ•˜์œ„ 1๋น„ํŠธ๋ฅผ ์ œ๊ฑฐ
60+
// ans++;
61+
// }
62+
// return ans;
63+
// }
64+
65+
// solution 3.
66+
// lookup table (8-bit ๋‹จ์œ„๋กœ)
67+
// ์ด ์•„์ด๋””์–ด๋Š” ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•ด์„œ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
68+
69+
70+
// solution 4.
71+
// population count ์•Œ๊ณ ๋ฆฌ์ฆ˜
72+
// https://blog.naver.com/jinhan814/222540111549
73+
// http://shumin.co.kr/algorithm-hamming-weight-bit-count/
74+
public int hammingWeight(int n) {
75+
n = (n >> 1 & 0x55555555) + (n & 0x55555555);
76+
n = (n >> 2 & 0x33333333) + (n & 0x33333333);
77+
n = (n >> 4 & 0x0F0F0F0F) + (n & 0x0F0F0F0F);
78+
n = (n >> 8 & 0x00FF00FF) + (n & 0x00FF00FF);
79+
n = (n >> 16 & 0x0000FFFF) + (n & 0x0000FFFF);
80+
return n;
81+
}
82+
83+
// solution 5.
84+
// ์ž๋ฐ” ๋‚ด์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉ O(logn)
85+
// public int hammingWeight(int n) {
86+
// return Integer.bitCount(n);
87+
// }
88+
}

0 commit comments

Comments
ย (0)