【发布时间】:2018-01-23 17:05:18
【问题描述】:
我一直在 codefights.com 上进行代码战,我在下面遇到了这个问题。我自己解决了这个问题,但是当我研究其他人的解决方案时,我发现一个比我短得多的解决方案,但我似乎无法理解他们为什么这样做。
问题是:
给你一个最多包含四个非负整数的数组,每个小于 256。 你的任务是按以下方式将这些整数打包成一个数字 M:
数组的第一个元素占据M的前8位; 第二个元素占据接下来的 8 位,依此类推。 返回得到的整数M。
注意:短语“M 的第一位”指的是 M 的最低有效位 - 整数的最右边位。如需进一步说明,请参阅以下示例。
例子
对于 a = [24, 85, 0],输出应该是 arrayPacking(a) = 21784.
数组 [24, 85, 0] 在二进制中看起来像 [00011000, 01010101, 00000000]。 将这些打包成一个数字后,我们得到 00000000 01010101 00011000(为方便起见放置了空格),等于 21784。
他们的回答是:
func arrayPacking(a []int) (sum int) {
for i := range a {
sum += a[len(a) - i - 1] << uint((len(a) - i - 1) * 8)
}
return
}
此代码如何仅通过使用 0、8、16 等间隔返回正确的移位量?我最近一直在按位进行研究,但我似乎仍然无法解释为什么会这样。
【问题讨论】:
-
我不确定我是否理解这个问题。您移动 8 的倍数,因为字节是 8 位。你能澄清你在问什么吗?
-
尽管
len(a)-i-1位有点烦人,这似乎很简单(尽管 n0 16 位,你得到前 8 个零,858 位,得到中间的01010101。如果你没有注意到,256 =1<<8。
标签: arrays go bit-manipulation bit shift