Javascript 创建此号码的最快方法?

Javascript 创建此号码的最快方法?,javascript,bit-manipulation,Javascript,Bit Manipulation,我正在编写一个函数,将带符号的数字扩展到更宽的位长度。这是PowerPC指令集中经常使用的操作。这就是我到目前为止所做的: function exts(value, from, to) { return (value | something_goes_here); } value是整数输入,from是value使用的位数,to是目标位长度 创建将to-from位设置为1,然后将from位设置为0的数字的最有效方法是什么 忽略JavaScript没有0bnumber语法这一事实,例如,如

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

function exts(value, from, to) {
    return (value | something_goes_here);
}
value
是整数输入,
from
value
使用的位数,
to
是目标位长度

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

忽略JavaScript没有
0b
number语法这一事实,例如,如果我调用

exts(0b1010101010, 10, 14)

我希望函数使用
0b11110000000000
,返回符号扩展结果
0b11111010101010

我不太熟悉JavaScript中的二进制数学。。。但是如果你需要一个带有
0b11110000000000
的数字,那么我假设你只需要将它转换成十进制(这将得到
15360
),然后执行
值| 15360

您可能会发现有用的相关信息:
parseInt(“1111000000000”,2)
将二进制数(指定为字符串)转换为十进制数,
(15360)。toString(2)
将十进制数(本例中为15360)转换为二进制数(结果为字符串)


修订后的解决方案

也许有一种更优雅、更数学的方法,但这里有一个快速而肮脏的解决方案:

var S = "";
for(var i=0;i<p;i++)
   S += "1";
for(i=0;i<q;i++)
   S += "0";
S = parseInt(S, 2); // convert to decimal
var S=”“;

对于(var i=0;i一个包含
p
一位后跟
q
零位的数字,可以通过

((1<<p)-1)<<q

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

0...010...0
 p-1    q
那么,2^q-1具有表示形式

0...01...1
  p    q
这与你想要的正好相反,所以只需翻转一下

因此,您需要的不是((1按q向左移位)-1)
=
~((1)这只是一个例子。我想知道如何有效地创建一个数字,该数字由设置为
1
p
位和设置为
0
q
位组成。JS没有整数类型,只有浮点数。您可能希望使用类型化数组,但这需要现代浏览器。总之,在C中是正常的你可以通过
(value |)(-1)来实现这一点,但如果我将数字扩展到小于32位的值,这是JavaScript中唯一可用的“类整数”宽度(即
(p+q)<32
),那么据我所知,你的方法将导致最高的
32-(p+q)
位设置为
1
,这是错误的。我假设您使用的是正确宽度的类型。您可以和我使用的((1啊,我明白您的意思。谢谢!
0...010...0
 p-1    q
0...01...1
  p    q