创建这个数字的最快方法?

时间:2011-05-22 08:37:36

标签: javascript bit-manipulation

我正在编写一个函数来将带符号的数字扩展到更宽的位长。这是PowerPC指令集中经常使用的操作。这就是我到目前为止所做的:

function exts(value, from, to) {
    return (value | something_goes_here);
}

value是整数输入,fromvalue正在使用的位数,to是目标位长。

创建将to - from位设置为1,然后将from位设置为0的数字的最有效方法是什么?

忽略JavaScript没有0b数字语法的事实,例如,如果我调用

exts(0b1010101010, 10, 14)

我希望函数将值与0b11110000000000进行OR运算,返回符号扩展结果0b11111010101010

3 个答案:

答案 0 :(得分:5)

可以通过

生成一个包含p一位后跟q零位的数字
((1<<p)-1)<<q

因此在你的情况下

((1<<(to-from))-1)<<from

或更短

(1<<to)-(1<<from)

答案 1 :(得分:0)

我对JavaScript中的二进制数学并不过分熟悉......但是如果你需要使用0b11110000000000或者数字,那么我假设你只需将它转换为十进制(这会得到你{{1} }),然后做15360

您可能觉得有用的相关信息:value | 15360将二进制数字(指定作为字符串)转换为十进制数字,parseInt("11110000000000", 2)转换十进制数字(15360)在这种情况下)到二进制数(结果是一个字符串)。


修订解决方案

可能有更优雅和数学方法,但这是一个快速而肮脏的解决方案:

(15360).toString(2)

答案 2 :(得分:0)

如果您将数字2 ^ q(= 1左移q)表示为宽度为p + q位的整数,则表示:

0...010...0
 p-1    q

然后2 ^ q - 1具有表示

0...01...1
  p    q

这正好与你想要的相反。所以只需翻转位

因此你想要的不是((1左移) - 1) 用符号表示~((1 << q) - 1)