vitalgg 发表于 2024-11-11 10:46:46

autolisp 位运算

本帖最后由 vitalgg 于 2024-11-13 10:29 编辑



很多系统变量 如 osmode cmdactive dbmod dyndigrip 等都是使用位码来控制的。
还有很多组码 如 hatch的92边界类型标志、多段线标志70、视口状态90等

使用这些操作可以很好地操作一个或多个数据位而不影响其它数据位。





本文主要涉及的autolisp函数:
boole logand logior ~
还有一个 lsh (左移位),本文未说明。

位运算
and
两个相应的位的值都是1时,返回1,否则返回0


(boole 1 int1 int2)
(logand int1 int2)

xor
两个相应的位的值只有一个是1,则返回 1,否则返回0。

自反性:任何值与自身异或的结果为0,任何值与 0 异或的结果为其本身。

异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1 表示真,0 表示假,这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

(boole 6 int1 int2)

or
两个相应的位的值有一个以上是1,返回1,否则返回0

(boole 7 int1 int2)
(logior int1 int2)

nor
两个输入位都是 0 ,返回 1,否则返回0

NOR运算的结果是OR运算的反面。

(boole 8 int1 int2)

not
按位取反

(~ int1)

boole 位运算函数
位运算是对于整数的运算,其结果也是整数。

cad中整数的范围是-2147483648~2147483647。
即32位的有符号整数。
-2147483648 的二进制为 0b1000 0000 0000 0000 0000 0000 0000 0000
2147483647 的二进制为 0b0111 1111 1111 1111 1111 1111 1111 1111

CAD中与位相关的变量如 osmode 最大值为 16383。即14个控制位。

其实还有个第14位(从0开始计数),禁用位即 16384。

位运算的数位是32位。当操作时会影响最高位即符号位。所以可能会出现正负整数的结果。osmode 的默认值为 4133。


(m:dec2base 4133 2)
;; "1000000100101"
(m:dec2base 512 2)
;; "1000000000"

以下以设置第9位为例(从0开始数位)

(setq 0b1000000000 512)

置1 or操作
(boole 7 4133 0b1000000000) ;; 第9位,置1,返回值 4645
置0
为保证不影响其它位值,可先置1,再减。

(- (boole 7 4645 0b1000000000) 0b1000000000) ;; 第9位,置0,
(- (boole 7 4133 0b1000000000) 0b1000000000) ;; 不管原来的第9位是否为0,最后均返回 4133。

反转
反转第9位(第9位的bit值为1的),其它不变。xor 操作

(boole 6 4133 0b1000000000);;原来的第9位是为0,返回 4645。
(boole 6 4645 0b1000000000);;原来的第9位是为1,返回 4133。

禁用对象捕捉
即第14位,置1

(setvar "osmode" (boole 7 (getvar"osmode") 16384))

启用对象捕捉
即第14位,置0

(setvar "osmode" (- (boole 7 (getvar"osmode") 16384) 16384))

也可以判断osmode是否大于16384然后做减法

(setvar "osmode" (boole 7 (getvar"osmode") 16384))
(if (>= (getvar "osmode") 16384)
(setvar "osmode" (- (getvar "osmode") 16384)))

反转对象捕捉
相当于按下 F3 。

(setvar "osmode" (boole 6 (getvar"osmode")16384))

进制转化函数
m:dec2base
十进制转其它进制 可在公众号 ”CAD应用云“ 或QQ机器人”CAD应用云“或QQ频道”CAD应用云“ 中回复 函数名获取相应用法说明


http://bbs.mjtd.com/data/attachment/forum/202312/21/211339e6j76hp6nzc95n8a.png

http://bbs.mjtd.com/data/attachment/forum/202409/24/214927kize9bamimb4c40v.png

原文: https://mp.weixin.qq.com/s?__biz ... dafbe8eb8db9220c#rd



vitalgg 发表于 2024-11-11 15:44:05

mahuan1279 发表于 2024-11-11 15:34
为啥(boole 8 0 0)=-1?

or 0 0 => 0b0000 0000 0000 0000 0000 0000 0000 0000
nor 0 0 =>0b1111 1111 1111 1111 1111 1111 1111 1111

0b1111 1111 1111 1111 1111 1111 1111 1111 这个的十进制值就是-1

位操作不考虑符号位和数据位。
需要了解有符号整数的 符号位和补码相关知识内容。

vitalgg 发表于 2024-11-13 10:29:10

jun470 发表于 2024-11-13 09:53
这个是在哪里需要的呢,是注册程序这块吗?

很多系统变量 如 osmode cmdactive dbmod dyndigrip 等都是使用位码来控制的。
还有很多组码 如 hatch的92边界类型标志、多段线标志70、视口状态90等

使用这些操作可以很好地操作一个或多个数据位而不影响其它数据位。

jun470 发表于 2024-11-13 15:10:10

vitalgg 发表于 2024-11-13 10:29
很多系统变量 如 osmode cmdactive dbmod dyndigrip 等都是使用位码来控制的。
还有很多组码 如 hatch的 ...

哦,我在不了解这个的时候,比如捕捉设置就只能固定几个组合,(getvar "osmode")读取出来,然后赋值(SETVAR "OSMODE" 4791):L

咏郡 发表于 2024-11-11 10:57:01

太复杂了{:1_1:}

vitalgg 发表于 2024-11-11 11:05:57

咏郡 发表于 2024-11-11 10:57
太复杂了

从 CAD 转来的开发者对 bit 位操作的知识了解相对少些。学计算机的 bit 位作为控制标志位很常见。

hubeiwdlue 发表于 2024-11-11 12:33:48

学习学习。

飞雪神光 发表于 2024-11-11 15:03:42

666      

mahuan1279 发表于 2024-11-11 15:34:58

为啥(boole 8 0 0)=-1?

chslwj521 发表于 2024-11-11 16:12:00

:lol不错不错学习

13605 发表于 2024-11-11 16:59:25

666学习学习

oistre 发表于 2024-11-12 09:27:18

不错不错学习
页: [1] 2
查看完整版本: autolisp 位运算