ASP AND, OR, XOR 邏輯運算子、比較運算子

無法脫離 ASP 的 VB 情況基本邏輯運算的比較結果只有兩種一種是 True、一種是 False 而在 ASP 的語法中 AND、OR 和 XOR 運算子也可以對「兩個數值邏輯運算 Logical Operations on Numbers」表示式中依位置相同的二進位進行逐位比較。

ASP 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 不支持的程式。


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()。

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)