明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 659|回复: 14

[基础] autolisp 位运算

[复制链接]
发表于 2024-11-11 10:46:46 | 显示全部楼层 |阅读模式
本帖最后由 vitalgg 于 2024-11-13 10:29 编辑



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

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





本文主要涉及的autolisp函数:

boole logand logior ~
还有一个 lsh (左移位),本文未说明。

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

  1. (boole 1 int1 int2)
  2. (logand int1 int2)


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

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

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

  1. (boole 6 int1 int2)
复制代码


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

  1. (boole 7 int1 int2)
  2. (logior int1 int2)


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

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

  1. (boole 8 int1 int2)


not
按位取反

  1. (~ 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。

  1. (m:dec2base 4133 2)
  2. ;; "1000000100101"
  3. (m:dec2base 512 2)
  4. ;; "1000000000"


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

  1. (setq 0b1000000000 512)


置1 or操作
(boole 7 4133 0b1000000000) ;; 第9位,置1,返回值 4645
置0
为保证不影响其它位值,可先置1,再减。
  1. (- (boole 7 4645 0b1000000000) 0b1000000000) ;; 第9位,置0,
  2. (- (boole 7 4133 0b1000000000) 0b1000000000) ;; 不管原来的第9位是否为0,最后均返回 4133。


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

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


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

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


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

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


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

  1. (setvar "osmode" (boole 7 (getvar  "osmode") 16384))
  2. (if (>= (getvar "osmode") 16384)
  3.   (setvar "osmode" (- (getvar "osmode") 16384)))


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

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


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






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



评分

参与人数 3明经币 +3 收起 理由
USER2128 + 1 很给力!
kucha007 + 1 很给力!
Bao_lai + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-11-11 15:44:05 | 显示全部楼层

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

位操作不考虑符号位和数据位。
需要了解有符号整数的 符号位和补码相关知识内容。
 楼主| 发表于 2024-11-13 10:29:10 | 显示全部楼层
jun470 发表于 2024-11-13 09:53
这个是在哪里需要的呢,是注册程序这块吗?

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

使用这些操作可以很好地操作一个或多个数据位而不影响其它数据位。
发表于 2024-11-13 15:10:10 | 显示全部楼层
vitalgg 发表于 2024-11-13 10:29
很多系统变量 如 osmode cmdactive dbmod dyndigrip 等都是使用位码来控制的。
还有很多组码 如 hatch的 ...

哦,我在不了解这个的时候,比如捕捉设置就只能固定几个组合,(getvar "osmode")读取出来,然后赋值(SETVAR "OSMODE" 4791)
 楼主| 发表于 2024-11-11 11:05:57 | 显示全部楼层

从 CAD 转来的开发者对 bit 位操作的知识了解相对少些。学计算机的 bit 位作为控制标志位很常见。
发表于 2024-11-11 15:03:42 | 显示全部楼层
666        
发表于 2024-11-11 15:34:58 | 显示全部楼层
为啥(boole 8 0 0)=-1?
发表于 2024-11-11 16:12:00 | 显示全部楼层
不错不错学习
发表于 2024-11-11 16:59:25 | 显示全部楼层
666学习学习
发表于 2024-11-12 09:27:18 | 显示全部楼层
不错不错学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 21:05 , Processed in 0.164957 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表