(在 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 美分...)