Go 言語(以下 Golang)で、1 バイトのデータを左シフトさせたのち、右側末尾にビット・ローテーションさせたい。いわゆる、ひとつの循環シフト。
普通にビットシフトすると溢れたビットは消えてしまうのです。
func main() {
v := uint8(0b11110000)
w := v << 1 // 1 ビットの左シフト
fmt.Printf("%08b\n", v)
fmt.Printf("%08b\n", w)
}
// Output:
// 11110000
// 11100000
つまり、こういうことがしたいのです。
# Before
- 0b11110000
# After
+ 0b11100001
「(bytes
にローテーションってないのかしら)」と、「golang 1バイト 左シフト ローテーション」でググるも、タイトルからドンピシャの記事がヒットしなかった(開かないとわからない)記事ばかりだったため、自分のググラビリティとして。
TL; DR (今北産業)
-
math/bits パッケージの RotateLeft 系の関数を使う。
-
RotateLeft 関数の種類(
x
= データ、k
= シフトしたいビット数・マイナス値は右ローテーション) -
マスター、動くものをくれ。
package main import ( "fmt" "math/bits" ) func Example() { fmt.Printf("%08b\n", 0b00001111) // --> 15 fmt.Printf("%08b\n", bits.RotateLeft8(15, 1)) // 左シフト fmt.Printf("%08b\n", bits.RotateLeft8(15, -1)) // 右シフト // Output: // 00001111 // 00011110 // 10000111 }
- オンラインで動作を見る @ Go Playground