注意只能對整型執(zhí)行按位運算。浮點值必須轉換為整型后,才能執(zhí)行按位運算。按位運算采用二進制(以 2 為基)形式計算兩個整數(shù)值。它們比較對應位置上的位,然后基于比較的結果賦值。下面的示例演示了 And 運算符。復制Dim x As Integerx = 3 And 5 前面的示例將 x 的值設置為 1。發(fā)生這種情況的原因如下:這些值以二進制形式處理:二進制格式的 3 為 011二進制格式的 5 為 101And 運算符比較這些二進制表示方式,一次比較一個二進制位置(位)。如果給定位置的兩個位都為 1,則將 1 放在結果中的該位置。如果任何一個位是 0,則將 0 放在結果中的該位置。在前面的示例中,按如下所示計算結果:011(二進制格式的 3)101(二進制格式的 5)001(二進制格式的計算結果)計算結果以十進制形式處理。值 001 是 1 的二進制表示形式,因此 x = 1。除了在任何一個比較位是 1 或兩個比較位都是 1 的情況下將 1 賦予結果位以外,按位 Or 運算與此類似。Xor 在比較的位正好只有一個是 1(而不是兩者都是 1)時將 1 賦給結果位。Not 采用單個操作數(shù)并反轉所有位(包括符號位),然后將該值賦予結果。這意味著,對于有符號正數(shù),Not 始終返回負值,而對于負數(shù),Not 始終返回正值或零。AndAlso 和OrElse 運算符不支持按位運算。 追問: 好復雜啊...還是不會,還有整數(shù)怎么轉換為二進制數(shù)? 回答: 為什么一定要用位運算呢,你那個乘法只能通過左移操作符“ ”來進行,而左移一次代表乘以2,要是乘以一個小數(shù),就必須先化成2的n次方,不夠再用加減法調整,很麻煩啊,沒必要用位運算啊。。。 追問: 因為我要進行大量的運算,但速度要快,所有用位運算...我也不想啊.. 回答: 那就不該用VB 啊,c/c++在執(zhí)行效率上是沒話說的。 追問: 問題就是不會嘛... 回答: 那你上csdn上發(fā)帖效果應該不錯 追問: CSDN發(fā)了,我發(fā)在高性能運算,沒人... 回答: 耐心一些,或者你應該發(fā)到VB.NET論壇那里。。。
公司主營業(yè)務:成都網(wǎng)站制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出臨泉免費做網(wǎng)站回饋大家。
AndAlso是短路的邏輯與運算符,And有兩個含義:非短路的邏輯與運算符;按位與運算符
Dim c=a AndAlso b表達式中,若表達式a的計算結果是False,無論表達式b是什么樣,都不再進行計算,直接返回c的值
Dim c=a And b表達式中,無論a和b是怎樣的表達式,都要全部計算完成后再返回c的值
AndAlso相比And的區(qū)別,除了性能優(yōu)勢外,更重要的是,從語義上來說
If a Then
If b Then
End If
End If
等價于If a AndAlso b Then而不等價于If a And b Then
考慮這種情況:
Dim m As ClassM=****
Dim c=m IsNot Nothing AndAlso m.Succeeded
這種實際編程中經(jīng)常遇到的判斷,如果把AndAlso替換成And,在m Is Nothing的情況下會引發(fā)NullReferenceException空引用異常,而AndAlso能確保不會引發(fā)空引用異常
進行邏輯運算的時候,And只在一種情況下有價值:不僅想要得到c的值,而且無論如何都希望執(zhí)行b過程,并且自己能確保a=False不會影響b的執(zhí)行。其他情況下務必使用AndAlso
OrElse和Or同理,作為上面那句的逆判斷
Dim c=m Is Nothing OrElse m.Failed
也是經(jīng)常使用的。當然在進行位運算時,只能用And和Or,AndAlso和OrElse沒有位運算功能
用bitarray類和BitVector32類實現(xiàn)
VB實現(xiàn)大致如下:
Imports?System.Collections.Specialized
...
Dim?bvData?as?BitVector32
Dim?sec1?As?BitVector32.Section?=?BitVector32.CreateSection(255)
Dim?sec2?As?BitVector32.Section?=?BitVector32.CreateSection(255,sec1)
Dim?sec3?As?BitVector32.Section?=?BitVector32.CreateSection(255,sec2)
Dim?sec4?As?BitVector32.Section?=?BitVector32.CreateSection(255,sec3)
Dim?Buf(4096)?as?Byte?'receive?byte?size?matched?with?DSP?send?data:?1024*4Byte
Dim?recCount?as?Integer
Dim?Data(1024)?as?long
....
For?recCount?=?0?To?1023
bvData(sec4)?=?buf(recByte*4)
bvData(sec3)?=?buf(recByte*4+1)
bvData(sec2)?=?buf(recByte*4+2)
bvData(sec1)?=?buf(recByte*4+3)
Data(recCount)?=?bvData.Data?'這樣數(shù)據(jù)肯定是-398
Next
....
1左移10位,1后面加10個0
結果就是:10000000000
五、按位運算符
注意不能在VB.Net中直接使用以下二進制數(shù),使用時需轉換為相應的十六或十進制數(shù)字。
1. 表示按位左移,空缺處補0。如:101101 2 結果為 110100
2. 表示按位右移,如:101101 2 結果為 001011
TextBox1.Text?=?7?And?10
TextBox1.Text?=?7?Or?10
TextBox1.Text?=?7?Xor?10
TextBox1.Text?=?Not?10
TextBox1.Text?=?7??10
TextBox1.Text?=?7??10
如這些,我在VB.Net中也找不到shl和shr運算符~
不過可以通過"自定義運算符"來寫出我們想要的功能