我正在编写一个函数来将带符号的数字扩展到更宽的位长。这是PowerPC指令集中经常使用的操作。这就是我到目前为止所做的:
function exts(value, from, to) {
return (value | something_goes_here);
}
value
是整数输入,from
是value
正在使用的位数,to
是目标位长。
创建将to - from
位设置为1
,然后将from
位设置为0
的数字的最有效方法是什么?
忽略JavaScript没有0b
数字语法的事实,例如,如果我调用
exts(0b1010101010, 10, 14)
我希望函数将值与0b11110000000000
进行OR运算,返回符号扩展结果0b11111010101010
。
答案 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)