Scheme 左移位到fixnum符号位

Scheme 左移位到fixnum符号位,scheme,chez-scheme,r6rs,Scheme,Chez Scheme,R6rs,我正在寻找一种方法,将一个正fixnum转换为符号位置。基本上,我想要的是一种可预测(而不是未定义)的方式,在没有溢出检查的情况下执行fixnum左移位 效率低下的实现如下所示: (定义左移 (λ(值移位) (让([未签名到已签名 (λ(值宽度) (让*([符号掩码(按位算术左移 1(-宽度1))] [符号(按位和值符号掩码)]) (按位ior) (按位位字段值0宽度) (-sign)))] (未签名到已签名) (按位算术左移值移位) (固定宽度(()())) (左移1 59)⇒ 5764607

我正在寻找一种方法,将一个正fixnum转换为符号位置。基本上,我想要的是一种可预测(而不是未定义)的方式,在没有溢出检查的情况下执行fixnum左移位

效率低下的实现如下所示:

(定义左移
(λ(值移位)
(让([未签名到已签名
(λ(值宽度)
(让*([符号掩码(按位算术左移
1(-宽度1))]
[符号(按位和值符号掩码)])
(按位ior)
(按位位字段值0宽度)
(-sign)))]
(未签名到已签名)
(按位算术左移值移位)
(固定宽度(()()))
(左移1 59)⇒ 576460752303423488
(左移160档)⇒ -1152921504606846976
(左移161)⇒ 0

理想情况下,这将编译为一条CPU指令(至少对于恒定移位;CPU在处理移位的方式上与寄存器一样宽或更宽方面有所不同)。

在scheme中,除非您查找

在方案中,它是标准化的,这使得控制数字表示的内侧非常不方便


只有当您了解某个实现的内部结构时,您所尝试的操作才有意义,否则将浪费您的时间。

您无法保证数字是fixnum或它将符号存储为msb。R6RS会自动为一个更高的数字留出更多的空间,因为你在其中添加了1。我认为这并不重要。R6RS库有
(fixnum width)
,而fixnum操作需要两个补码,因此过程的行为将得到很好的定义。这可能没有帮助,但在Racket中,我认为您需要的是
不安全的fxlshift
,它来自
Racket/unsafe/ops