File tree Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Expand file tree Collapse file tree 1 file changed +52
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * Write a function that takes an unsigned integer and returns the number of
3
+ * ’1' bits it has (also known as the Hamming weight).
4
+ *
5
+ * For example, the 32-bit integer '11' has binary representation
6
+ * 00000000000000000000000000001011, so the function should return 3.
7
+ *
8
+ * Tags: Bit Manipulation
9
+ */
10
+ class NumberOfBits {
11
+ public static void main (String [] args ) {
12
+ NumberOfBits nob = new NumberOfBits ();
13
+ int n = 111 ;
14
+ System .out .println (nob .hammingWeight (n ));
15
+ System .out .println (nob .hammingWeightB (n ));
16
+ System .out .println (nob .hammingWeightC (n ));
17
+ }
18
+
19
+ /**
20
+ * Pure bit manipulation
21
+ * "n &= n - 1" is used to delete the right "1" of n
22
+ * Stop when all 1s are deleted and n is zero
23
+ */
24
+ public int hammingWeight (int n ) {
25
+ int res = 0 ;
26
+ while (n != 0 ) {
27
+ res ++;
28
+ n &= n - 1 ;
29
+ }
30
+ return res ;
31
+ }
32
+
33
+ /**
34
+ * Most straight forward solution
35
+ * Iterate 32 times to check each digit in n
36
+ */
37
+ public int hammingWeightB (int n ) {
38
+ int res = 0 ;
39
+ for (int i = 0 ; i < 32 ; i ++) // no need to iterate 32 times
40
+ if ((n >>> i & 0x1 ) == 1 ) res ++;
41
+ return res ;
42
+ }
43
+
44
+ /**
45
+ * Recursive
46
+ * If n is 0 or 1, return n
47
+ * If not, return n & 1 + hammingWeightC(n >>> 1)
48
+ */
49
+ public int hammingWeightC (int n ) {
50
+ return n == 0 || n == 1 ? n : (n & 1 ) + hammingWeightC (n >>>1 );
51
+ }
52
+ }
You can’t perform that action at this time.
0 commit comments