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;
}