Arrays 按位移位以及此解决方案的工作原理

Arrays 按位移位以及此解决方案的工作原理,arrays,go,bit-manipulation,bit,shift,Arrays,Go,Bit Manipulation,Bit,Shift,我一直在codefights.com上进行代码斗争,我在下面遇到了这个问题。我自己解决了这个问题,但当我研究其他人的解决方案时,我发现了一个比我的短得多的解决方案,但我似乎无法理解他们为什么这么做 问题是: 您将获得一个最多由四个非负整数组成的数组,每个非负整数小于256。 您的任务是按以下方式将这些整数打包为一个数字M: 阵列的第一个元素占据M的前8位; 第二个元素占用接下来的8位,依此类推。 返回获得的整数M 注:短语“M的第一位”指M的最低有效位-整数的最右位。有关进一步说明,请参见以下示

我一直在codefights.com上进行代码斗争,我在下面遇到了这个问题。我自己解决了这个问题,但当我研究其他人的解决方案时,我发现了一个比我的短得多的解决方案,但我似乎无法理解他们为什么这么做

问题是:

您将获得一个最多由四个非负整数组成的数组,每个非负整数小于256。 您的任务是按以下方式将这些整数打包为一个数字M:

阵列的第一个元素占据M的前8位; 第二个元素占用接下来的8位,依此类推。 返回获得的整数M

注:短语“M的第一位”指M的最低有效位-整数的最右位。有关进一步说明,请参见以下示例

范例

对于a=[24,85,0],输出应为 阵列封装(a)=21784

数组[24,85,0]在二进制中看起来像[00011000101010100000000]。 在将这些数据打包成一个数字后,我们得到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
}
func数组打包(a[]整数)(总和整数){
对于i:=范围a{

sum+=a[len(a)-i-1]以8的倍数进行位移位与以256的倍数进行位移位相同,例如,
x以8的倍数进行位移位与以256的倍数进行位移位相同,例如,
x首先,在Go中写入解决方案。我们将小尾数、基256位转换为基2(二进制)数字。左移8位乘以256

package main

import (
    "fmt"
)

func pack(digits []int) (number int) {
    // digits are little-endian, base-256 (1 << 8 = 256)
    for i, digit := range digits {
        number += digit << uint(i*8)
    }
    return number
}

func main() {
    a := []int{24, 85, 0}
    m := pack(a)
    fmt.Println(m)
}
现在你应该能够找出他们丑陋的答案:

func arrayPacking(a []int) (sum int) {
    for i := range a {
        sum += a[len(a) - i - 1] << uint((len(a) - i - 1) * 8)
    }
    return
}
func数组打包(a[]整数)(总和整数){
对于i:=范围a{

sum+=a[len(a)-i-1]首先,用Go写出解。我们将小尾数、基256位转换为基2(二进制)数。左移8位乘以256

package main

import (
    "fmt"
)

func pack(digits []int) (number int) {
    // digits are little-endian, base-256 (1 << 8 = 256)
    for i, digit := range digits {
        number += digit << uint(i*8)
    }
    return number
}

func main() {
    a := []int{24, 85, 0}
    m := pack(a)
    fmt.Println(m)
}
现在你应该能够找出他们丑陋的答案:

func arrayPacking(a []int) (sum int) {
    for i := range a {
        sum += a[len(a) - i - 1] << uint((len(a) - i - 1) * 8)
    }
    return
}
func数组打包(a[]整数)(总和整数){
对于i:=范围a{

sum+=a[len(a)-i-1]我不确定我是否理解这个问题。你将移位8的倍数,因为字节是8位。你能澄清一下你的问题吗?尽管
len(a)-i-1
位有点烦人(你称之为len O(n)),但这似乎很简单好几次!虽然我不确定我是否理解这个问题。你可以用8的倍数移位,因为字节是8位。你能澄清一下你的问题吗?尽管
len(a)-I-1
bit有点烦人(你称之为len O(n)),但这看起来很琐碎时代!虽然你忘记了类型转换。谢谢。你能帮我添加它吗?我不写Go,而且忘记了细节。我想把你的答案也标记为解决方案。我选择下面的答案是因为它被细分了一点,并且是用Go写的(我觉得这可以帮助将来有同样问题的读者)。我感谢你的回答。你忘记了类型转换。谢谢。你能帮我添加它吗?我不写Go,而且忘记了细节。我也想将你的答案标记为解决方案。我选择了以下答案,因为它被进一步分解并写在Go中(我觉得这可以帮助未来有同样问题的读者)1.我感谢你的答复。