(在 Visual Basic 中)是否可以通过一个字节 "loop" 或 "rotate",而不使用(if-then-tree)或(和 &HFF)?
(in Visual Basic) Is it possible to "loop" or "rotate" through a byte, without using an( if-then-tree) or (and &HFF)?
我的意思是:如果一个字节的值为255,我加1,它又变成0。
或者,如果我从零值中减去 1,它就会变成 255。
我有很多代码,像这样处理字节,
我宁愿不筛选所有行来查找此类 rotations
好吧,没有什么冒险......
干杯
强尼
编辑:
只是一个愚蠢的例子:
Sub Tester()
Dim Arr(255) As Byte
Dim BytePointer As Byte = 200
Dim value As Byte
Arr(50) = 1
For i = 0 To 5000
BytePointer = BytePointer + 1
value = Arr(BytePointer)
If value = 1 Then MessageBox.Show("Found 1")
Next
end sub
因此会导致溢出异常。
这个可以不用做吗:
BytePointer = (BytePointer + 1) and &FF
您没有指定您使用的 BASIC,但此答案假定使用 FreeBasic。
您应该将 BytePointer 变量声明为 UByte
.
Byte
的数字范围是从 -128 到 +127(“有符号”),但是对于 UByte
它是 0 到 255(“无符号”),这与数组边界很好地匹配.
当您的代码使用 Dim BytePointer As Byte = 200
初始化 BytePointer 变量时,FreeBasic 已经将其设置为 -56,并且当您的代码递增 BytePointer 变量与 BytePointer = BytePointer + 1
它变成 -55.
由于此索引 (-55) 超出范围 (0,255),指令 value = Arr(BytePointer)
不会寻址数组的元素。
下一个代码工作正常,从 255 回绕到 0 没有问题:
Dim Arr(255) As Byte
Dim BytePointer As UByte = 251
Dim value As Byte
Dim i As Integer
For i = 0 To 255
Arr(i)=i
Next
For i = 1 To 10
value = Arr(BytePointer)
Print BytePointer, value
BytePointer = BytePointer + 1
Next
好的....
通过“在高级编译器选项对话框中删除整数溢出检查”,您可以 wrap-around 字节和整数,而无需 overflow-errors。
但它对整个项目都是如此。
我可以用这个...
遗憾的是,VB 不提供默认执行此操作的变量(我们称它们为 winteger 或 wbyte)。 (只是我的 2 美分...)
我的意思是:如果一个字节的值为255,我加1,它又变成0。 或者,如果我从零值中减去 1,它就会变成 255。 我有很多代码,像这样处理字节, 我宁愿不筛选所有行来查找此类 rotations
好吧,没有什么冒险......
干杯 强尼
编辑: 只是一个愚蠢的例子:
Sub Tester()
Dim Arr(255) As Byte
Dim BytePointer As Byte = 200
Dim value As Byte
Arr(50) = 1
For i = 0 To 5000
BytePointer = BytePointer + 1
value = Arr(BytePointer)
If value = 1 Then MessageBox.Show("Found 1")
Next
end sub
因此会导致溢出异常。
这个可以不用做吗:
BytePointer = (BytePointer + 1) and &FF
您没有指定您使用的 BASIC,但此答案假定使用 FreeBasic。
您应该将 BytePointer 变量声明为 UByte
.
Byte
的数字范围是从 -128 到 +127(“有符号”),但是对于 UByte
它是 0 到 255(“无符号”),这与数组边界很好地匹配.
当您的代码使用 Dim BytePointer As Byte = 200
初始化 BytePointer 变量时,FreeBasic 已经将其设置为 -56,并且当您的代码递增 BytePointer 变量与 BytePointer = BytePointer + 1
它变成 -55.
由于此索引 (-55) 超出范围 (0,255),指令 value = Arr(BytePointer)
不会寻址数组的元素。
下一个代码工作正常,从 255 回绕到 0 没有问题:
Dim Arr(255) As Byte
Dim BytePointer As UByte = 251
Dim value As Byte
Dim i As Integer
For i = 0 To 255
Arr(i)=i
Next
For i = 1 To 10
value = Arr(BytePointer)
Print BytePointer, value
BytePointer = BytePointer + 1
Next
好的....
通过“在高级编译器选项对话框中删除整数溢出检查”,您可以 wrap-around 字节和整数,而无需 overflow-errors。
但它对整个项目都是如此。
我可以用这个...
遗憾的是,VB 不提供默认执行此操作的变量(我们称它们为 winteger 或 wbyte)。 (只是我的 2 美分...)