LoginSignup
0
0

More than 1 year has passed since last update.

【Golang】1 バイトデータのビットローテーション【左循環シフト】

Last updated at Posted at 2022-11-21

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 (今北産業)

  1. math/bits パッケージの RotateLeft 系の関数を使う。

  2. RotateLeft 関数の種類x = データ、k = シフトしたいビット数・マイナス値は右ローテーション)

    1. RotateLeft(x uint, k int) uint
    2. RotateLeft8(x uint8, K int) uint8
    3. RotateLeft16(x uint16, k int) uint16
    4. RotateLeft32(x uint32, k int) uint32
    5. RotateLeft64(x uint64, k int) uint64
  3. マスター、動くものをくれ。

    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
    }
    
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0