AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

[已解決]AUTOLISP的函數-boole位元式布林運算,在兩個數值的情況下,附官方英文的說明網頁

上一篇主題 下一篇主題 向下

[已解決]AUTOLISP的函數-boole位元式布林運算,在兩個數值的情況下,附官方英文的說明網頁

發表 由 RyanGuo 于 2013-07-15, 04:13

Google搜尋"boole" site:docs.autodesk.com,
<以下有紅字的地方表示有連結可點>
有看到官方的英文說明文件-查看請點我.
它有一個關鍵表格.
Boolean truth table
Int1
Int2
operator bit
008
014
102
111
和一個延伸的表格
Boole function bit values
Operator
Operation
Resulting bit is 1 if
1ANDBoth input bits are 1
6=4+2XOROnly one of the two input bits is 1
7=4+2+1OREither or both of the input bits are 1
8NORBoth input bits are 0 (1's complement)
用官方舉的例子來說...

  • (Boole 1 12 5)傳回4

Boole後面的1代表是用AND
8421
12轉2進位=1100=8*1+4*1
5轉2進位=0101=4*1+1*1
0100=4*1=4
每個位元做AND運算,也就是說都有1的才有1,
都有1的=4*1=4

  • (Boole 6 6 5)傳回3

Boole後面的6代表是用XOR
421
6轉2進位=110=4*1+2*1
5轉2進位=101=4*1+1*1
011=2*1+1*1=3
每個位元做XOR運算,也就是說有1和0的變成1,
有1和0的=2*1+1*1=3
ps.XOR的定義由關鍵表格的內容來解釋的話,
(int1=0和int2=1)(int1=1和int2=0)的話要傳回1(在每個位元值),
所以Operator的數值上面兩種情況代表值(Operator)的合,所以是4+2


  • (Boole 4 3 14)傳回12

Boole後面的4代表是看表格中的int1=0和int2=1
8421
3轉2進位=0011=2*1+1*1
14轉2進位=1110=8*1+4*1+2*1
1100=8*1+4*1=12
一樣每個位元個別去看,int1=0且int2=1的才填1
答案=8*1+4*1=12

以上,是官方所舉例子的說明,他們避開了最難以理解NOR.

  • 下面用例子解釋NOR的運作

8421
6轉2進位=0110=4*1+2*1
14轉2進位=1110=8*1+4*1+2*1
0001再求這數值的1的補數
根據關鍵表格,只有在兩個數值為0時,填1,
這邊所得到的數值還不是最後的解答,需再算1的補數.

求1的補數(頂部延伸表格紅字有連結)
符號位元8421用2的補數解讀數值部分
00001
111101111=8*1+4*1+2*1+1*1=15
上面的符號位元1表示為負.
求1的補數時,0的地方改1,1的地方改0.
需要特別注意的地方是電腦解讀2進位的方式是用2的補數解讀,
解讀時,數值在加上正負號前要先加1,
(記憶的方法是:如果電腦用最高位元表示法解讀的話,能用的數字會少1個,因為正負號對0來說沒有意義,也就是說0被重複定義了.)
但求得結果的過程中使用的是1的補數方式.
本題最終回傳的是-15

以上,應該對吧...
和AutoCAD對話了好久,應該是沒錯才對@@a

ps.1.wiki上的二進制說明.
ps.2.boole是位元運算(bitwise)相關的函數,搜尋bitwise可得到其他和位元運算相關的函數.
avatar
RyanGuo
初級會員
初級會員

文章總數 : 206
年齡 : 34
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 2896
威望值 : 303
注冊日期 : 2013-04-18
男 射手座 狗

回頂端 向下

回復: [已解決]AUTOLISP的函數-boole位元式布林運算,在兩個數值的情況下,附官方英文的說明網頁

發表 由 達夫 于 2013-08-27, 12:54

好精彩的一篇說明,首先要給 RyanGuo大 一個讚,給你拍拍手。
看得出 RyanGuo大 花了不少時間消化原文說明,還要理出頭緒
講給別人了解著實不容易。相信有啃過原文書的同好都有此同感。
讚啦!! 
我覺得您的理解很深入又正確,只有最後有關NOR的部份,就是AutoLISP
會如何把結果值傳回使用者,這個過程的說明不夠清楚,
我不確定您是否把兩件事誤為一件事了。

因為官網的說明中並沒有針對OR運算和NOR運算舉例,也沒有指出它們之間的關係,
這部份留給使用者自己推敲的確不易。

官網中的延伸的表格最後一列的註解欄有指出,
當運算子為8做NOR運算時,結果本身是 (1's complement)1的補數型態。

它是指NOR運算後的結果本身就是OR運算結果的(1的補數)型態。
但這種定義是針對使用者來說的邏輯關係,並不是指電腦中的資料型態。

接著您舉例用6及14做NOR運算,結果是0001,這個結果0001的意義
己經是某一數的(1的補數)型態了。應該不用再對結果做一次(1的補數)
轉換才對,這是我担心的一件事。

接下來就是AutoLISP如何看這個0001,如何傳回給使用者的問題。
其實一開始做運算的時候,就將6和14轉換成五位二進制數比較清楚,
連最高位正負號位一起運算,無形中省掉很多麻煩和理解的陷阱。

6轉成二進制00110,14轉成二進制01110,
兩個正數做NOR運算,得出結果10001。
這個值只對人來說有1的補數型態的意義。

但AutoLISP拿到這值並不知道它是誰,AutoLISP只管它是一個整數,
最高位是1所以是負數。然後將這個負數轉換成十進制傳回給使用者。
又因為電腦對負數的處理是以 (正值的2的補數型態) 儲存數值,
所以10001到底是負幾,還必須先轉回正值才知道。

10001先做1的補數轉換,再將1的補數加1成為2的補數,就轉換成正值了,
10001 ==> 01110 ==> 01110+1=01111(15),正值是15。所以10001是負15。
因此,我們才會看到 AutoLISP 把 (boole 8 6 14) 的結果傳回來是 -15。


一點個人淺見。
害羞
avatar
達夫
初級會員
初級會員

文章總數 : 115
年齡 : 50
來自 : 新北市
職業 : 玻璃帷幕
愛好 : 游泳,彈吉他
個性 : 隨和,內向,樂於助人
使用年資 : 10年以上
使用版本 : R2012
積分 : 3
經驗值 : 2937
威望值 : 175
注冊日期 : 2011-04-21
男 摩羯座 馬

回頂端 向下

回復: [已解決]AUTOLISP的函數-boole位元式布林運算,在兩個數值的情況下,附官方英文的說明網頁

發表 由 RyanGuo 于 2013-08-28, 01:30

感謝~感謝~;p
原來是這樣!!!
我都沒想過要先轉成有最高位元後再進行運算,
這樣說來應該全部的運算都應該是先轉成有最高位元後再運算,
但因為我全部都只用正數去算,
所以就只有最後的NOR出現了邏輯上轉不過去的地方,
有了你的說明我想我真的是瞭解它是怎樣運作了;p
avatar
RyanGuo
初級會員
初級會員

文章總數 : 206
年齡 : 34
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 2896
威望值 : 303
注冊日期 : 2013-04-18
男 射手座 狗

回頂端 向下

回復: [已解決]AUTOLISP的函數-boole位元式布林運算,在兩個數值的情況下,附官方英文的說明網頁

發表 由 達夫 于 2013-08-28, 04:23

RyanGuo 寫到:感謝~感謝~;p
原來是這樣!!!
我都沒想過要先轉成有最高位元後再進行運算,
這樣說來應該全部的運算都應該是先轉成有最高位元後再運算,
但因為我全部都只用正數去算,
所以就只有最後的NOR出現了邏輯上轉不過去的地方,
有了你的說明我想我真的是瞭解它是怎樣運作了;p
開心 嘻嘻 
沒有,沒有,大家互相幫忙求進步。
avatar
達夫
初級會員
初級會員

文章總數 : 115
年齡 : 50
來自 : 新北市
職業 : 玻璃帷幕
愛好 : 游泳,彈吉他
個性 : 隨和,內向,樂於助人
使用年資 : 10年以上
使用版本 : R2012
積分 : 3
經驗值 : 2937
威望值 : 175
注冊日期 : 2011-04-21
男 摩羯座 馬

回頂端 向下

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章