2016-06-30 2 views

답변

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 
2

R6RS 인 최신 정식 버전을 사용할 것으로 예상되는 버전을 지정하지 않았기 때문에. R6RS는 정확한 비트 산술 (artithmetic) 라이브러리에게 그것의 번호는 고정 폭 구속하지만, >>><<이 변화의 eiher 음성 또는 양성 번호 bitwise-arithmetic-shift으로 구현되지 않기 때문에 >>이없는 (rnrs arithmetic bitwise (6))

계획을 가지고있다. 특정 오른쪽 및 왼쪽 버전도 있지만 중복되어 있습니다.

구성표에 bitwise-rotate-bit-field이 있고 지침을 제공하지 않기 때문에 자바 스크립트에서 에뮬레이션한다고 생각합니다.

(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)) 
+0

내가이 기능은 휴대용되고 싶어 그래서 R5RS 위해 필요 : 귀하의 bit-rol이 중 하나만 사용하여 구현 될 수있다. – jcubic

+1

@jcubic ** R6RS를 지원하는 모든 구현에서 ** 휴대용입니다. Scheme 버전을 알고 있다면 태그를 달 수 있습니다. r7rs, r6rs 및 r5rs는 표준 버전을 지정하는 데 사용할 수있는 태그입니다. 이 답변을 유용하게 사용할 수있는 r6rs 사용자가있을 수 있으므로 답변을 남겨 두겠습니다. – Sylwester

관련 문제