func getValFromPackedIx()

in packed.go [102:131]


func getValFromPackedIx(ix uint64, bits uint, read func(off uint64, cnt uint64) ([]uint64, error)) (val uint64, err error) {
	bitstart := ix * uint64(bits)
	word := bitstart / 64
	bitoff := bitstart % 64
	getbits := 64 - (bitoff)

	if getbits > uint64(bits) {
		getbits = uint64(bits)
	}
	needWords := uint64(1)
	if getbits < uint64(bits) {
		needWords = 2
	}
	words, err := read(word, needWords)
	if err != nil {
		return 0, err
	}

	// now get 'getbits' from 'word' starting at 'bitoff'
	sl := (64 - getbits - bitoff)
	val = (words[0] << sl)
	sr := (64 - getbits)
	val >>= sr
	if getbits < uint64(bits) {
		remainder := uint64(bits) - getbits
		x := (words[1] << (64 - remainder)) >> (64 - remainder)
		val |= x << getbits
	}
	return
}