如何执行JavaScript的>>>在计划?

时间:2016-06-30 11:52:14

标签: javascript scheme

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))))

2 个答案:

答案 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))