diff --git a/pullrequests/number_of_1bits/step1.go b/pullrequests/number_of_1bits/step1.go new file mode 100644 index 0000000..623f75f --- /dev/null +++ b/pullrequests/number_of_1bits/step1.go @@ -0,0 +1,21 @@ +//lint:file-ignore U1000 Ignore all unused code +package numberof1bits + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:3分 + +rightmost set bitは n & (n - 1) で求めることができるので、効率的にcountしていくことができる。 +*/ +func hammingWeightStep1(n int) int { + count := 0 + for n > 0 { + n &= n - 1 + count += 1 + } + return count +} diff --git a/pullrequests/number_of_1bits/step2.go b/pullrequests/number_of_1bits/step2.go new file mode 100644 index 0000000..1ef4a31 --- /dev/null +++ b/pullrequests/number_of_1bits/step2.go @@ -0,0 +1,19 @@ +//lint:file-ignore U1000 Ignore all unused code +package numberof1bits + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +またはnの2の補数(-n)を使って、n & -n でrightmost set bitのみがsetされているビット列を取得し、最後にnから引くことでrightmost set bitをunsetすることもできる。 +*/ +func hammingWeightStep2(n int) int { + count := 0 + for n > 0 { + n -= (n & -n) + count += 1 + } + return count +} diff --git a/pullrequests/number_of_1bits/step3.go b/pullrequests/number_of_1bits/step3.go new file mode 100644 index 0000000..c97f5c3 --- /dev/null +++ b/pullrequests/number_of_1bits/step3.go @@ -0,0 +1,28 @@ +//lint:file-ignore U1000 Ignore all unused code +package numberof1bits + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +ナイーブに解くこともできる。この場合はO(n)の時間計算量になり、効率が悪い。 +*/ +func hammingWeightStep3_1(n int) int { + count := 0 + for n > 0 { + count += n % 2 + n /= 2 + } + return count +} + +func hammingWeightStep3_2(n int) int { + count := 0 + for n != 0 { + count += n & 1 + n >>= 1 + } + return count +}