如何在Common Lisp中对位数组指定位置的位进行模增?
在Common Lisp中实现位数组特定位的模增操作
要实现位数组特定位的模2增(即翻转该位:0变1,1变0),核心是确保赋值结果为合法的BIT类型(只能是整数0或1)。以下是几种可行实现方式:
方法1:用1减去当前位
利用1-0=1、1-1=0的特性,直接生成合法BIT值:
(setf (bit x 3) (- 1 (bit x 3)))
方法2:异或操作
通过logxor与1做异或运算,01=1、11=0,结果均为合法BIT:
(setf (bit x 3) (logxor (bit x 3) 1))
方法3:条件判断(直观写法)
显式判断当前位值,返回对应的翻转结果:
(setf (bit x 3) (if (zerop (bit x 3)) 1 0))
为什么之前的尝试会报错?
- 使用
+或incf:计算结果会超出BIT范围(如1+1=2),触发类型错误。 - 使用
not:返回布尔值NIL/T,而非BIT要求的整数0/1,类型不匹配。 - 使用
lognot:对整数1按位取反得到-2(补码表示),不属于BIT类型。 - 使用
bit-not:该函数针对整个位数组取反,而非单个位,不符合需求。
测试示例
CL-USER> (setf x #*0001) #*0001 CL-USER> (bit x 3) 1 CL-USER> (setf (bit x 3) (- 1 (bit x 3))) 0 CL-USER> x #*0000 CL-USER> (setf (bit x 3) (logxor (bit x 3) 1)) 1 CL-USER> x #*0001
内容的提问来源于stack exchange,提问作者Jérôme Radix
相关产品推荐
相关产品推荐

