Как построить перевернутые однобитовые битовые поля с индексом? - PullRequest
0 голосов
/ 14 сентября 2018

Каков наиболее эффективный способ создания перевернутых однобитовых битовых полей с учетом входного индекса?

Например:

input: 0 output: 100000000000
input: 1 output: 010000000000
input: 2 output: 001000000000
input: 9 output: 000000000100

1 Ответ

0 голосов
/ 14 сентября 2018

Вы ищете оператор правого сдвига , который сдвигает каждый бит своего левого операнда вправо столько раз, сколько указано правым операндом.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...