Javascript 如何有效地添加两个JS数字,这两个JS数字是存储为两个';补语

Javascript 如何有效地添加两个JS数字,这两个JS数字是存储为两个';补语,javascript,binary,bit-manipulation,twos-complement,Javascript,Binary,Bit Manipulation,Twos Complement,我将四个numbers存储在一个JS原语number中,其中20=-20,作为4 x 6位2的补码,通过执行以下操作: function convertToBits(a: number, b: number, c: number, d: number) { const mask = 0b111111; return ((d & mask) << 18) | ((c & mask) << 12) | ((b & mask) <&

我将四个
number
s存储在一个JS原语
number
中,其中
20=-20
,作为4 x 6位2的补码,通过执行以下操作:

function convertToBits(a: number, b: number, c: number, d: number) {
    const mask = 0b111111;
    return ((d & mask) << 18) | ((c & mask) << 12) | ((b & mask) << 6) | (a & mask);
}

convertToBits(-7, 31, 12, -32); // => 0b100000_001100_011111_111001
我正在寻找一种有效的方法,将
a
的四个组件中的每一个添加到
b
中相应的组件中,这样,考虑到上述输入:

function addBits(a: number, b: number) {
  // Missing implementation
}

addBits(a, b); // => 0b0;

所以我想出了一个方法来获得我想要的结果,但我忍不住认为可能有一个更有效的方法来做到这一点。然而,它提供了正确的输出

function addBits(a: number, b: number) {
  const mask = 0b111111;
  const m = ((a & mask) + (b & mask)) & mask;
  const n = (((a >> 6) & mask) + ((b >> 6) & mask)) & mask;
  const o = (((a >> 12) & mask) + ((b >> 12) & mask)) & mask;
  const p = ((a >> 18) & mask) + ((b >> 18) & (mask)) & mask;

  return m | (n << 6) | (o << 12) | (p << 18);
}
函数添加位(a:数字,b:数字){
常数掩码=0b111111;
常数m=((a和掩码)+(b和掩码))&掩码;
常数n=((a>>6)和掩码)+((b>>6)和掩码))&mask;
常数o=((a>>12)和掩码)+(b>>12)和掩码);
常数p=((a>>18)和掩码)+((b>>18)和(掩码))和掩码;

返回m |(n您可以使用一个事实,即对于单个位,“+”(忽略进位)的结果由XOR给出。然后您可以首先计算不带符号位的和,可能在符号位中生成进位,但不干扰下一个6位组,然后将符号位的和作为因子。未测试代码:

function addBits(x: number, y: number) {
    const signmask = 0b100000_100000_100000_100000;
    let sum_without_sign_bits = ((x & ~signmask) + (y & ~signmask));
    let sum_of_sign_bits = (x ^ y) & signmask;
    return sum_without_sign_bits ^ sum_of_sign_bits;
}

很有趣。谢谢。你认为这是一种更有效的方法吗?很可能是的,因为它的整数运算数量要少得多。
function addBits(x: number, y: number) {
    const signmask = 0b100000_100000_100000_100000;
    let sum_without_sign_bits = ((x & ~signmask) + (y & ~signmask));
    let sum_of_sign_bits = (x ^ y) & signmask;
    return sum_without_sign_bits ^ sum_of_sign_bits;
}