AND, OR, XOR 逻辑运算子、比较运算子

逻辑运算子 Logical Operator 和比较运算子 Comparison Operator 是程式设计中常用的运算子。逻辑运算子用于对布林值进行逻辑操作例如 ANDORNOT 等。比较运算子用于对两个或多个值进行比较,例如等于 ==、不等于 !=、大于 >、小于 <。逻辑运算子和比较运算子的结果都是布林值,可以用于控制程式的流程,例如程式设计中条件判断、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()。

在于 .aspxCommon 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)