我想用加法和移位法编制两个数相乘的程序我已经用sbcl lisp编写了这个代码。
(defun calculator (num1 num2)
(write-line "In the function")
(let ((res 0))
(loop for lpr from 0 to 63
do (let ((end-bit (logand num2 1)))
(format t "res is : ~a. ~%" num2)
(if (= end-bit 1)
(+ res num1))
(ash num2 -1)
(ash num1 1)
(format t "after ash ~a ~%"num2)))
(format t "result is ~a.~%" res)))
(let ((num1 (progn
(write-line "Enter first number: ")
(finish-output)
(read)))
(num2 (progn
(write-line "Enter second number: ")
(finish-output)
(read))))
(if (or (= num1 0) (= num2 0))
(write-line "result is 0.0")
(calculator num1 num2)))
但是res,num2,num1,结束位变量的值在整个程序中保持不变。我认为逻辑和位操作没有发生。问题是什么。
最佳答案
没有函数+
或ash
在适当的位置执行它们的操作,这意味着您必须将结果设置回变量。
因此,要更新var,请按如下方式执行:
(setf num2 (ash num2 -1))
对于增量和减量,有一个称为
incf
的就地变量:(incf res num1) ; (setf res (+ res num1))