嗨,我是 Visual Basic 的新手,我有一个项目需要能够操作值中的各个位。
我需要能够在 1 和 0 之间切换这些位,并将多次出现的位组合到我的代码中的一个变量中。
每个位将代表一个 TRUE / FALSE 值,因此我不是在寻找如何在一个变量中执行单个 TRUE / FALSE 值,而是在一个变量中寻找多个 TRUE / FALSE 值。
有人可以向我解释一下我如何做到这一点。
提前谢谢了。
它必须是一位吗?
为什么不为此使用实际内置的 VB 数据类型 Boolean。
http://msdn.microsoft.com/en-us/library/wts33hb3(v=vs.80).aspx
它存在的唯一原因是您可以定义具有 2 种状态(真或假)的变量。
Dim myVar As Boolean
myVar = True
myVar = Flase
if myVar = False Then
myVar = True
End If
在阅读了 OP 的各种答案和评论后,我现在了解了 OP 试图实现的目标。
正如其他人所说,在这些语言中可以使用的最小单位是 8 位字节。根本没有比这更小的数据类型的顺序。
但是,通过一些创造性思维和少量二进制操作,您可以将该字节的内容称为单个位。
但是,首先您需要了解二进制数系统:
二进制中的所有数字都是 2 的幂,从右到左。
每列都是其前身的两倍,所以:
1 变成 2,2 变成 4,4 变成 8,依此类推
纯粹以二进制数查看此列,您的列将被标记为:
128 64 32 16 8 4 2 1(记住从右到左)
这给了我们以下信息:
The bit at position 1 = 1;
The bit at position 2 = 2;
The bit at position 3 = 4;
The bit at position 4 = 8;
等等。
在您拥有的最小数据类型(字节)上使用此方法,您可以将 8 位打包成一个值。也就是说,您可以使用一个变量来保存 8 个单独的值 1 或 0
因此,虽然您不能小于一个字节,但您仍然可以通过将 8 个值打包到 1 个变量中来减少内存消耗。
你如何读取和写入这些值?
还记得列位置吗?好吧,您可以使用称为位移位和位掩码的东西。
位移是使用
<<
和
>>
运营商
移位操作将要移位的列数作为参数。
例如:
Dim byte myByte
myByte = 1 << 4
在这种情况下,变量“myByte”将等于 16,但您实际上会将位位置 5 设置为 1,如果我们说明这一点,它会更有意义:
mybyte = 0 = 00000000 = 0
mybyte = 1 = 00000001 = 1
mybyte = 2 = 00000010 = (1 << 1)
mybyte = 4 = 00000100 = (1 << 2)
mybyte = 8 = 00001000 = (1 << 3)
mybyte = 16 = 00010000 = (1 << 4)
如果您注意到 0 到 16 等于我上面提到的从右到左的列值。
鉴于我刚才解释的内容,如果您想将位 5、4 和 1 设置为等于 1,其余设置为 0,您可以简单地使用:
mybyte = 25(16 + 8 + 1) = 00011001 = (1 << 4) + (1 << 3) + 1
为了让你的位回来,变成一个单例,你只需换个方向
retrieved bit = mybyte >> 4 = 00000001
然而不幸的是,移位方法存在一个小缺陷。
通过来回移动,您很可能会从您可能已经设置的任何位中丢失信息,为了防止这种情况发生,最好将您的位移操作与位掩码和布尔操作(例如“与”和“或者'
要了解这些,您首先需要了解以下简单的逻辑原理:
和
如果 A 和 B 输入均为 1,则输出为 1
以图形方式说明这一点
A B | Output
-------------
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1
如您所见,如果我们的输入数字中的位位置为 1,并且我们的输入数字 B 中的相同位置为 1,那么我们将在输出数字中保留该位置,否则我们将丢弃该位并将其设置为 0 ,举个例子:
00011001 = Bits 5,4 and 1 are set
00010000 = Our mask ONLY has bit 5 set
如果我们执行
00011001 AND 0010000
我们会得到一个结果
00010000
然后我们可以向下移动 5
00010000 >> 5 = 00000001 = 1
因此,通过使用 AND,我们现在可以检查字节中的单个位是否为 1:
if ((mybyte AND 16) >> 1) = 1 then
'Bit one is set
else
'Bit one is NOT set
end if
通过使用不同的掩码,如前所示,从右到左的列中使用不同的 2 值,我们可以轻松地从我们的字节中提取不同的奇异值并将它们视为简单的位值。
设置一个字节同样简单,除非您使用“或”以相反的方式执行操作
或者
如果 A 或 B 输入为 1,则输出为 1
以图形方式说明这一点
A B | Output
-------------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
例如:
00011001 OR 00000100 = 00011101
如您所见,位置 4 的位已设置。
但是,要回答开始这一切的基本问题,您不能在 VB 中使用任何分辨率小于 1 字节的数据类型,我怀疑您是否需要绝对的位精度,我猜您必须编写压缩算法或某种加密系统。:-)
01010100 01110010 01110101 01100101,是单词“TRUE”的字符串值
您想要的是将信息存储在布尔值中
Dim v As Boolean
v = True
v = False
或者
If number = 84 Then ' 84 = 01010100 = T
v = True
End If
其他信息
从技术上讲,你不能存储任何东西,最小值是一个 8 位的字符。您需要学习如何进行按位运算。或者使用BitArray类。
VB.NET(也不是我知道的任何其他 .NET 语言)具有“位”数据类型。您可以使用的最小的是Byte
. (不是 a Char
,它们的大小是两个字节)。因此,虽然您可以读取值 84 的字节并将其转换为值为 1 的字节表示真,并将值 101 的字节转换为值 0 的字节表示假,但您并没有节省任何内存。
现在,如果您有少量且固定数量的这些标志,您可以将它们中的几个存储在其中一种整数数据类型中(在 .NET 中,最大的整数数据类型是 64 位)。或者,如果您有大量这些标志,您可以使用BitArray
该类(它使用相同的技术,但使用数组支持它,因此存储容量更大)。