バイナリで109,1101101などの整数があるとします。この数値のビットをどのように反復するのですか?たとえば:[64,32,8,4,1]? lispでこれを行う良い方法は何でしょうか?私は、ケースを追加してforマクロを少し修正するべきですか?または、整数をビットベクトルまたはリストに変換する必要がありますか?整数のビットをループするlispの方法
3
A
答えて
6
"ones"だけを処理したい場合、すべてのビットをループするのは効率的ではありません。これは、それは少し-AND演算数とその反対は最下位セットビットとそのビットの論理積数と1以下を返し素敵な2補体事実を使用しています私はこのケースで
(defmacro do-bits ((var x) &rest body)
"Evaluates [body] forms after binding [var] to each set bit in [x]"
(let ((k (gensym)))
`(do ((,k ,x (logand ,k (1- ,k))))
((= ,k 0))
(let ((,var (logand ,k (- ,k))))
,@body))))
を行いたいです数字よりもこの最下位ビットが0になります。この処理が最上位に最下位セットビットから動作することを
注意(あなたの例では、あなたが逆の順序付けを使用)
0
これはおそらく、あまり洗練されているが、行います。ゼロを呼び出すと、反復コールバックは呼び出されないので、使用する前に `zerop 'をテストする必要があることに注意してください。
(defun iterate-bits-of (x handler)
(unless (zerop x)
(and (funcall handler (logand x 1))
(iterate-bits-of (ash x -1) handler))))
(iterate-bits-of
#b1101101
#'(lambda (x) (not (format t "bit ~b~&" x))))
;; bit 1
;; bit 0
;; bit 1
;; bit 1
;; bit 0
;; bit 1
;; bit 1
大きな数字の場合、「灰」は非常に高価になることがあります。この場合、おそらく6502のバリアントを使用することになります。
5
logbitpを見ると、整数の個々のビットにアクセスできます。たとえば、
(loop for i below (integer-length 109)
collect (if (logbitp i 109) 1 0))
=> (1 0 1 1 0 1 1)
関連する問題
- 1. ルビ整数でビットをループする
- 2. LISP - 整数のシーケンス
- 3. は32ビット整数1つの方法の第31ビット(MSB)を読み出すために32ビット整数
- 4. 64ビット整数のすべてのビットと32ビット整数を比較する
- 5. 整数のビットを反復するPythonの方法
- 6. 整数lispの最小値
- 7. Rubyで2つの32ビット整数に64ビット整数を格納する方法
- 8. 2ビット、1ビット、1ビット、4ビットの値を1バイトの整数に格納する方法
- 9. 16ビット整数の画像をQPixmapに変換する方法
- 10. Common Lispの `loop`マクロで従属ループ変数を使う方法
- 11. 11ビット整数を含むbytearrayを16ビット整数の配列にキャストする
- 12. C++の8ビット整数と32ビット整数のビット単位の論理和
- 13. 符号付き32ビット整数を符号なし32ビット整数に変換する方法は?
- 14. LISPでループを使う方法
- 15. 64ビットダンプで32ビット整数データを参照する方法
- 16. VB6で64ビット整数を表現する方法は?
- 17. 最大kビットをオンにして整数をループする最良の方法は何ですか?
- 18. 32ビット整数のビット操作
- 19. EDSAC - 17ビットと35ビットの整数
- 20. Common Lispでの整数除算
- 21. minSdkVersion正の32ビット整数
- 22. Javascriptのネイティブ64ビット整数
- 23. Ruby整数の抽出ビット
- 24. ビット64の整数とfst
- 25. 64ビット整数のNeo4j
- 26. Clojure - 整数の最後のNビットを抽出する最速の方法は?
- 27. 128ビット整数6
- 28. リバース32ビット整数
- 29. 数値が64ビット整数であるかどうかをチェックする方法
- 30. 8086アセンブリで2つの64ビット整数を減算する方法