Вы ищете оператор правого сдвига , который сдвигает каждый бит своего левого операнда вправо столько раз, сколько указано правым операндом.
x >> y // Shifts each bit in "x" to the right "y" times.
Toотобразите битовые поля, как в вашем примере, вы захотите использовать левый операнд с только самым левым установленным битом, затем сдвинуть вправо количество раз, как указано, и использовать директиву %b
printf для получения двоичной строки, например ( Go Playground ):
func setbit16(idx uint8) string {
return fmt.Sprintf("%016b", uint16(0x8000)>>idx)
}
func main() {
xs := []uint8{0, 1, 2, 9, 15, 20}
for _, x := range xs {
fmt.Printf("%2d -> %q\n", x, setbit16(x))
}
// 0 -> "1000000000000000"
// 1 -> "0100000000000000"
// 2 -> "0010000000000000"
// 9 -> "0000000001000000"
// 15 -> "0000000000000001"
// 20 -> "0000000000000000"
}
Конечно, если вы просто хотите получить результирующее число и не обязательно отображать битовое поле, тогда вы можете просто использовать оператор (или версию с левым сдвигом):
uint16(0x8000) >> 2 // => 0b0010000000000000
uint16(0x0001) << 2 // => 0b0000000000000100