Scheme只有>>
和<<
个函数。我如何在计划中做javascript >>>
?
我需要在scheme中编写这个函数:
function bit_rol (num, cnt) {
return (num << cnt) | (num >>> (32 - cnt))
}
这不起作用,因为&gt;&gt;&gt;是未绑定的符号:
(define (bit-rol num cnt)
(| (<< num cnt) (>>> num (- 32 cnt))))
答案 0 :(得分:2)
这是一个解决方案:
(define (complement x)
(if (negative? x)
(- (expt 2 32) (- x))
x))
(define (>>> x n)
(cond
[(>= n 0) (cond
[(= x 0) 0]
[(> x 0) (quotient x (expt 2 n))]
[(< x 0) (>>> (complement x) n)]
[else (error '>>> "strange number detected")])]
[else (error '>>> "expected a non-negative shift")]))
(>>> 5 2) ; 1
(>>> -5 2) ; 1073741822
答案 1 :(得分:2)
由于您未指定版本,我希望您使用的是R6RS的最新完整版本。 R6RS有一个精确的按位算术库(rnrs arithmetic bitwise (6))
Scheme没有>>
,因为它的数字不受固定宽度限制,但>>>
和<<
使用bitwise-arithmetic-shift
实现,其中更换为负数或正数。还有特定的左右版本,但它们是多余的。
Scheme已bitwise-rotate-bit-field
,我相信您在JavaScript中仿效它,因为它不提供旋转指令。只需使用一次即可实现bit-rol
:
(import (rnrs)
(rnrs arithmetic bitwise (6)))
(define (make-bit-rot bit-width)
(lambda (n step)
(bitwise-rotate-bit-field n
0
bit-width
(if (negative? step)
(mod step bit-width)
step))))
(define rot-4 (make-bit-rot 4))
(rot-4 #b0001 -1) ; ==> #b1000
(rot-4 #b1000 1) ; ==> #b0001
(rot-4 #b1000 3) ; ==> #b0100
// Seeems you are interested in 32 bit rotate
(define rot-32 (make-bit-rot 32))