Golangのhex.Encodeでは[]byte(uint8のスライス)の要素をビットシフトや0fとの論理積を使って16進数の文字列の[]byteに変換しています
なぜ、uint8をビットシフトや0fとの論理積で16進数に変換できるのでしょうか?



const hextable = "0123456789abcdef"

/* 中略 */

func Encode(dst, src []byte) int {
    for i, v := range src {
        dst[i*2] = hextable[v>>4]
        dst[i*2+1] = hextable[v&0x0f]
    }

    return len(src) * 2
}