如何将多个小值存储进一个值中
群里发面试题来看,无意之后看到。自己思考了一下觉得位运算就可以搞定。
题意大概就是让你可以有一个方法对三个数进行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的时候可以再按照每一位解析回来即可。