我有两个对象this
和that
,每个对象都代表最高的属性a
,b
,c
和d
,第二高,第二低和最低16位,表示每个中的64位无符号整数。
var a = this.a + that.a,
b = this.b + that.b,
c = this.c + that.c,
d = this.d + that.d;
if (d > 0xffff)
c += d >> 16,
d %= d % 0xffff;
if (c > 0xffff)
b += c >> 16,
c %= 0xffff;
if (b > 0xffff)
a += b >> 16,
b %= 0xffff;
if (a > 0xffff)
a %= 0xffff;
this.a = a;
this.b = b;
this.c = c;
this.d = d;
答案 0 :(得分:3)
该代码中存在错误。
d %= d % 0xffff;
应为d %= 0x10000;
。
c %= 0xffff;
应为c %= 0x10000;
,然后b
和a
相同。
不是先添加然后再处理进位,而是从最低的组件开始,然后使用进位从下一个组件:
var d = this.d + that.d;
var c = this.c + that.c + (d >> 16);
d &= 0xffff;
var b = this.b + that.b + (c >> 16);
c &= 0xffff;
var a = this.a + that.a + (b >> 16);
b &= 0xffff;
这会在a
中留下可能的溢出,如果您想忽略您只能执行a &= 0xffff;
,否则您可以报告错误if (a > 0xffff)
。