2015-04-10 2 views
2

У меня есть 32-битное целое число без знака, и я хочу разделить его на 3 значения uint16. Я хочу сначала 15 бит, затем 2 бита, а затем последние 15 бит.Получение битов из 32-битного беззнакового целого числа с использованием бит-сдвига в go lang

Я пытаюсь что-то вроде -

val >> 17 
val >> 2 
val >> 15 

кроме первого значения, другие 2 не правы, и я знаю, что, но теперь в состоянии понять, как это исправить?

Go play ground

+0

входы, выходы, пожалуйста :) – Populus

+0

добавлена ​​площадка ссылку с кодом .. – Varun

+0

мой вывод должен быть 35-8152-1. – Varun

ответ

3

Например,

package main 

import "fmt" 

func decode(bits uint32) (uint16, uint16, uint16) { 
    // first 15bits, then 2 bits and then last 15 bits. 
    const mask2 = ^uint32(0) >> (32 - 2) 
    const mask15 = ^uint32(0) >> (32 - 15) 
    b1 := uint16(bits >> (32 - 15)) 
    b2 := uint16(bits >> (32 - 15 - 2) & mask2) 
    b3 := uint16(bits & mask15) 
    return b1, b2, b3 
} 

func main() { 
    b := uint32(4628440) 
    b1, b2, b3 := decode(b) 
    fmt.Printf("%032b %015b %02b %015b\n", b, b1, b2, b3) 
    fmt.Printf("%d %d-%d-%d\n", b, b1, b2, b3) 
} 

Выход:

00000000010001101001111111011000 000000000100011 01 001111111011000 
4628440 35-1-8152 
+0

Спасибо peterSO, так что мне не хватало маску, не так ли? – Varun

+0

@Varun: Да. Как только вы переместили использованные биты в крайние правые позиции, вам нужно замаскировать все неиспользуемые биты слева. – peterSO

1

вспомогательная функция, чтобы извлечь диапазон бит делает это легко понять (и тест).

package main 

import "fmt" 

// extractUint16 extracts n bits of a from the given offset. 
func extractUint16(a uint32, offset, n uint) uint16 { 
    return uint16((a >> offset) & (1<<n - 1)) 
} 

func main() { 
    input := uint32(4628440) 
    a := extractUint16(input, 17, 15) 
    b := extractUint16(input, 15, 2) 
    c := extractUint16(input, 0, 15) 
    fmt.Println(a, b, c) 
} 
Смежные вопросы