AND, OR, XOR 邏輯運算子、比較運算子
邏輯運算子 Logical Operator 和比較運算子 Comparison Operator 是程式設計中常用的運算子。邏輯運算子用於對布林值進行邏輯操作例如 AND、OR、NOT 等。比較運算子用於對兩個或多個值進行比較,例如等於 ==、不等於 !=、大於 >、小於 <。邏輯運算子和比較運算子的結果都是布林值,可以用於控制程式的流程,例如程式設計中條件判斷、Loop 迴圈等應用。
無法脫離 ASP 的 VB 情況基本邏輯運算的比較結果只有兩種一種是 True、一種是 False 而在 ASP 的語法中 AND、OR 和 XOR 運算子也可以對「兩個數值邏輯運算 Logical Operations on Numbers」表示式中依位置相同的二進位進行逐位比較。
邏輯運算 Logical Operations 表達方式
127 AND 32 = 32
01111111 '十進位 127
AND 00100000 '十進位 32
= 00100000 '十進位 32
127 OR 32 = 127
01111111 '十進位 127
OR 00100000 '十進位 32
= 01111111 '十進位 127
127 XOR 32 = 95
01111111 '十進位 127
XOR 00100000 '十進位 32
= 01011111 '十進位 95
比照可以如上列的二進位一個個上下依 AND, OR, XOR 邏輯運算比較,輸出結果 Result = 則是十進位。
如果採用較新的 Visual Studio, Visual Basic ASP.NET Core 程式語言開發則會有相應的函式可以簡化 ASP 不支持的程式。
Convert 資料類型轉換
ASP.NET 可以通過 Convert 將整數值轉換成非十進位字串標記法,以及將代表非十進位數的字串轉換成整數值。這些轉換方法都包含一個 Base 引數,可以指定進位系統,二進位 (基底 2)、八進位 (基底 8),以及十六進位 (基底 16),以及十進位 (基底 10)。
Convert.ToInt32("111001", 2)) = 57
Convert.ToInt32("10000", 8)) = 4096
Convert.ToInt32("111001", 10)) = 111001
Convert.ToInt32("FFEE", 16)) = 65518
Hex() 返回十六進制值「預設函式」
傳回數值的十六進位值。十六進位可以加「&H」表示,例如 16 進位 &H10 表示十進位的 16。
Hex(10) ' A
Hex(20130928) ' 1332C70
(&H1332C70) ' 20130928
Hex(1999999999) ' Max 1,999,999,999 超出溢位
Oct() 返回八進制值「預設函式」
傳回數值的八進位值。八進位可以加「&O」表示,例如八進位 &O10 表示十進位的 8。
Oct(10) ' 10
Oct(100) ' 144
&O144 ' 100
&144 ' 100 ?
十進位制轉二進位制
十進位制轉二進位制,對十進位制數進行除 2 運算及 Mod 取出餘數,然後使用 StrReverse() 再將其倒過來得到二進位。
toBinaryString(127, 16) = 0000000001111111 '參數 16 為二進位長度補零,最大值 65535
toBinaryString(32, 16) = 0000000000100000
Function toBinaryString(valueDecimal, numPadding)
Dim binaryString, untilDecimal, intDecimal
binaryString = ""
intDecimal = valueDecimal
untilDecimal = valueDecimal
Do
untilDecimal = intDecimal / 2
binaryString = binaryString & (intDecimal Mod 2)
intDecimal = Int(untilDecimal)
Loop Until untilDecimal <= 0
binaryString = StrReverse(binaryString)
toBinaryString = ZeroBinaryPadding(binaryString, numPadding) '## 長度補零
End Function
Function ZeroBinaryPadding(valueBinary, numPadding)
Dim binaryLength, i
binaryLength = Len(valueBinary)
If binaryLength < numPadding Then
For i = 1 to numPadding - binaryLength
valueBinary = "0" & valueBinary
Next
End If
ZeroBinaryPadding = valueBinary
End Function
二進位制轉十進位制
toDecimalString("0000000001111111") = 127
toDecimalString("0000000000100000") = 32
Function toDecimalString(valueBinary)
Dim decimalValue, binaryReverse, i
binaryReverse = StrReverse(valueBinary)
decimalValue = 0
For i = 1 to Len(binaryReverse)
decimalValue = decimalValue + (Int(Mid(binaryReverse, i, 1)) * (2 ^ (i-1)))
Next
toDecimalString = decimalValue
End Function
ASP Bitwise Operator 移位運算子 (二進位)
搜尋如同 JavaScript Bitwise Operator 移位運算子的比照方法,而其中可能因 Integer 的取值範圍 -32768 到 32767 造成溢出返回負數,於 vbInteger 項目中改用 CLng() 但是範圍仍然只能 65535 之內 😓 或是直接取消 VarType 的判斷式都使用 CLng()。
在於 .aspx 的 Common Language Runtime 可以於 JavaScript 一樣的計算移位運算子。
LeftShift(256, 7) = 32768
LeftShift(256, 8) = 0 ' 出現 0 (65536) 二進位等於 10000000000000000
如果用 vbLong 長整數 CLng() -2147483648 到 2147483647 十六進位 &H80000000 到 &H7FFFFFFF。
shiftResult = LeftShift(256, 8)
CLng("&H" & Hex(shiftResult))
https://stackoverflow.com/questions/3466413/in-asp-bit-operator-left-shift-and-right-shift
JavaScript 將運算式的位元向右移位(以二進位方式),正負號保持不變。
256 >> 2 = 64
256 >> 3 = 32
ASP 移位運算子「右移位」
RightShift(256, 2) = 64
RightShift(256, 3) = 32
Function RightShift(pValue, pShift)
Dim NewValue, PrevValue, i
PrevValue = pValue
For i = 1 to pShift
Select Case VarType(pValue)
Case vbLong
NewValue = Int((PrevValue And "&H7FFFFFFF") / 2)
If PrevValue And "&H80000000" Then '只要不是 0 就為 True
NewValue = NewValue Or "&H40000000"
End If
NewValue = CLng(NewValue)
Case vbInteger
NewValue = Int((PrevValue And "&H7FFF") / 2)
If PrevValue And "&H8000" Then NewValue = NewValue Or "&H4000"
NewValue = CInt(NewValue)
Case vbByte
NewValue = CByte(PrevValue / 2)
Case Else: PrevValue = NewValue 'Err.Raise 13 ' Not a supported type
End Select
PrevValue = NewValue
Next
RightShift = PrevValue
End Function
基本上 pValue = pValue / 2 右移位幾次就除幾次,左移位變成 * 2。
JavaScript 將運算式的位元向左移位(以二進位方式),正負號保持不變。
256 << 2 = 1024
256 << 3 = 2048
ASP 移位運算子「左移位」
LeftShift(256, 2) = 1024
LeftShift(256, 3) = 2048
Function LeftShift(pValue, pShift)
Dim NewValue, PrevValue, i
PrevValue = pValue
For i = 1 to pShift
Select Case VarType(pValue)
Case vbLong
NewValue = (PrevValue And "&H3FFFFFFF") * 2
If PrevValue And "&H40000000" Then NewValue = NewValue Or "&H80000000"
NewValue = CLng(NewValue)
Case vbInteger
NewValue = (PrevValue And "&H3FFF") * 2
If PrevValue And "&H4000" Then NewValue = NewValue Or "&H8000"
NewValue = CLng("&H"+ Hex(NewValue))
Case vbByte
NewValue = CByte((PrevValue And "&H7F") * 2)
Case Else: Err.Raise 13 ' Not a supported type
End Select
PrevValue = NewValue
Next
LeftShift = NewVAlue
End Function
Err.Raise 用來產生執行階段錯誤,而且可以用來取代 Error 語句。但我的系統不支持。
16進位 Hexadecimal, 10進位 Decimal, 2進位 Binary 的 vbLong 長整數、vbInteger 整數比較。
&H80000000 = -2147483648 '(-10000000000000000000000000000000)
&H40000000 = 1073741824 '(1000000000000000000000000000000)
&H3FFFFFFF = 1073741823 '(111111111111111111111111111111)
&H7FFFFFFF = 2147483647 '(1111111111111111111111111111111)
&H8000 = -32768 '(-1000000000000000)
&H4000 = 16384 '(100000000000000)
&H3FFF = 16383 '(11111111111111)
&H7FFF = 32767 '(111111111111111)