github.com/segmentio/parquet-go@v0.0.0-20230712180008-5d42db8f0d47/internal/bitpack/unpack_int32_purego.go (about) 1 //go:build purego || !amd64 2 3 package bitpack 4 5 import ( 6 "github.com/segmentio/parquet-go/internal/unsafecast" 7 ) 8 9 func unpackInt32(dst []int32, src []byte, bitWidth uint) { 10 bits := unsafecast.BytesToUint32(src) 11 bitMask := uint32(1<<bitWidth) - 1 12 bitOffset := uint(0) 13 14 for n := range dst { 15 i := bitOffset / 32 16 j := bitOffset % 32 17 d := (bits[i] & (bitMask << j)) >> j 18 if j+bitWidth > 32 { 19 k := 32 - j 20 d |= (bits[i+1] & (bitMask >> k)) << k 21 } 22 dst[n] = int32(d) 23 bitOffset += bitWidth 24 } 25 }