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)