如何将多个小值存储进一个值中

群里发面试题来看,无意之后看到。自己思考了一下觉得位运算就可以搞定。

题意大概就是让你可以有一个方法对三个数进行encode之后存储进一个数。然后有一个decode方法能将这三个数从这一个数中还原回来。

go实现:

package main

import "fmt"

func encodeIntoHex(m map[string]int) (int) {
    data := 0
    data = m["orange"] & 0xff | m["banana"] & 0xff << 8 | m["apple"] & 0xff << 16
    return data
}

func decodeIntoInt(i int) (int, int, int) {
    orange := i & 0xff
    banana := i >> 8 & 0xff
    apple := i >> 16 & 0xff
    return orange, banana, apple
}


func main() {
    fruit := map[string]int {
        "orange": 3,
        "banana": 4,
        "apple": 5,
    }
    data := encodeIntoHex(fruit)
    fmt.Println(data)
    o, b, a := decodeIntoInt(data)
    fmt.Println(o, b, a)
}

总的来说,思路还是位运算。我们假设这个数是0-255的一个数。我们就可以使用每8bit来标示一个数。我们用一个32bit int型来存储最后的数。

这里假设我们有三个数,encode的时候将数按顺序,每个数与0xff与,然后在另外一个8bit位置上与另外一个数字或,即可得到结果。

在decode的时候可以再按照每一位解析回来即可。

posted @ 2017-04-14 14:32  piperck  阅读(266)  评论(0编辑  收藏  举报