You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:22:51