我试图遍历一个小字节数组(64个字节)的所有值。我想增加数字时钟的方式,从索引0开始,到0-255,然后再递增索引1,重复。我知道这可能是一种递归方法,但是我无法完全理解逻辑。
所以基本上,对于4字节数组(为方便起见,较小)
第一回合
值:[0 0 0 0]
256圆
值[255 0 0 0]
256圆
值[0 1 0 0]
回合257
值[1 1 0 0]
到目前为止我所拥有的:
func allValues() {
currentPlaceIndex := 0
content := make([]uint8, 64)
max := 256
for i := 0; i < max; i++ {
content[currentPlaceIndex] = uint8(i)
}
fmt.Println(content)
content[currentPlaceIndex] = 0
}
我似乎不知道该如何递归。
答案 0 :(得分:2)
该表示形式基本上是256个基数。第一个字节为round number % 256
。然后将轮数除以256,然后重复直到轮数变为0。
由于256是一个特殊数字(256 = 2 8 ),因此可以使用按位运算进行计算。例如。余数等于用0xff
进行位掩码,除以256等于右移8。
还要注意,标准库中有一个big.Int
类型,它表示一个(有符号的)多精度整数。它具有Int.Bytes()
方法,该方法将绝对值作为大尾数字节片返回。这几乎是我们想要的,只是字节顺序不同。因此,您可以简单地将整数转换为big.Int
(例如,使用Int.SetString()
方法),获取其字节片并将其取反。
如果您不想转换单个整数,而只是迭代后续值,则可以这样做:
您将从一个完整的零切片或数组开始。
检查切片的第一个元素。如果<255,只需将其递增1。完成迭代。
如果为255,则将其清零,然后尝试对第二个元素执行相同的操作:转到步骤2。
因此,如果您有状态,可以通过以下方法计算下一个状态:
func next(data []byte) {
for idx := range data {
if data[idx] < 255 {
data[idx]++
return
}
data[idx] = 0
}
fmt.Println("overflow")
}
这是测试它的方法:
data := make([]byte, 64)
for iter := 0; iter < 600; iter++ {
next(data)
fmt.Println(data)
}
这将输出(在Go Playground上尝试):
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
...
[255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
...
[255 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
...