假设我仅使用数组中的8位值来表示一个非常大的数字。假设数组长度为32个8位值。它从0开始。我只画4个8位的值来演示。
[0, 0, 0, 0]然后它就会倒数。
[0, 0, 0, 1]
[0, 0, 0, 2]
...
[0, 0, 0, 255]一旦它在第一列中达到255,它就会进入下一列。
[0, 0, 1, 0]
[0, 0, 1, 1]
[0, 0, 1, 2]
...
[0, 0, 1, 255]
[0, 0, 2, 0]
[0, 0, 2, 1]
...
[0, 0, 2, 255]
[0, 0, 3, 0]
[0, 0, 3, 1]
...填满后,它转到第三列,然后在填写后,它转到第四列,依此类推。
[0, 1, 0, 0]
[0, 1, 0, 1]
[0, 1, 0, 2]
[0, 1, 0, 3]
...
[0, 1, 1, 0]
[0, 1, 1, 1]
[0, 1, 1, 2]
...
[0, 1, 2, 0]
[0, 1, 2, 1]
...
...
[1, 0, 0, 0]
[1, 0, 0, 1]
[1, 0, 0, 2]
...
[1, 0, 0, 255]
[1, 0, 1, 0]
[1, 0, 1, 1]
...
...
...
[2, 0, 0, 0]
[2, 0, 0, 1]
...
...
...
and so on.如何编写算法来增加这些值,如下所示。就好像它是一个巨大的值,它只是使用较小的8位值来表示。这对我来说是一件令人费解的事情,而且我也没能做到。
实际上,我不确定我画的是反转的,我认为数字是从右边的最小位置到左边的较大位置,这就是为什么我这样画它。
发布于 2021-01-13 07:19:35
你可以用一个简单的for循环来做这件事(参见下面的代码片段,应该是非常不言自明的)
let number = [0,0,255,250];
const add = () => {
for ( let i = number.length - 1; i >= 0; i-- ) {
if(number[i]===255){
number[i] = 0;
} else {
number[i]++;
break;
}
}
console.log(number);
} <button onclick="add()">add</button>
发布于 2021-01-13 07:15:56
希望这就是你想说的。
function increase(ar){
ar[0] = ar[0] + 1;
for(let i = 0; i < ar.length-1; i++){
ar[i+1]+= ar[i] < 256 ? 0 : 1;
ar[i] = ar[i] < 256 ? ar[i] : 0;
}
return ar;
}
let res = [250,1,0,0];
for(let u = 0; u < 10; u++){
console.log(increase(res));
}
到目前为止,它可以更一般化,更改限制,也可以按N递增(在本例中,它仅递增1)。
一种可能的实现如下:
function increase(ar, step = 1, limit = 256){
ar[0] = ar[0] + step;
for(let i = 0; i < ar.length-1; i++){
ar[i+1]+= ar[i] < limit ? 0 : Math.floor(ar[i] / limit);
ar[i] = ar[i] < limit ? ar[i] : ar[i] % limit;
}
return ar;
}
let res = [248,0,0,0];
for(let u = 0; u < 10; u++){
console.log(increase(res, 3));
}
https://stackoverflow.com/questions/65693284
复制相似问题