Vb.net I';我对VisualBasic不太熟悉,正在尝试理解如何在一个字节中设置单个位
大家好,我是VisualBasic新手,我有一个项目,需要能够操作值中的各个位 我需要能够在1和0之间切换这些位,并在代码中将多次出现的位组合成一个变量 每一位都代表一个真/假值,所以我不是在寻找如何在一个变量中实现一个真/假值,而是在一个变量中实现多个真/假值 请有人解释一下我是如何做到这一点的Vb.net I';我对VisualBasic不太熟悉,正在尝试理解如何在一个字节中设置单个位,vb.net,binary,Vb.net,Binary,大家好,我是VisualBasic新手,我有一个项目,需要能够操作值中的各个位 我需要能够在1和0之间切换这些位,并在代码中将多次出现的位组合成一个变量 每一位都代表一个真/假值,所以我不是在寻找如何在一个变量中实现一个真/假值,而是在一个变量中实现多个真/假值 请有人解释一下我是如何做到这一点的 非常感谢。它必须精确到一位吗 为什么不使用实际的内置VB数据类型Boolean来实现这一点呢 它存在的唯一原因是,您可以定义具有两种状态的变量,true或false Dim myVar As Boo
非常感谢。它必须精确到一位吗 为什么不使用实际的内置VB数据类型Boolean来实现这一点呢 它存在的唯一原因是,您可以定义具有两种状态的变量,true或false
Dim myVar As Boolean
myVar = True
myVar = Flase
if myVar = False Then
myVar = True
End If
更新(1)
在阅读了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个值打包到一个变量中来减少内存消耗
如何读取和写入这些值
还记得柱子的位置吗?你可以使用位移位和位掩码
位移位是使用
<<
操作员
移位操作将要移位的列数作为参数
例如:
然而不幸的是,位移位法存在一个小缺陷
通过来回移位,很可能会丢失已设置的任何位的信息,为了防止这种情况发生,最好将位移位操作与位掩码和布尔运算(如“and”&“OR”)相结合
要理解这些,您首先需要理解以下简单的逻辑原则:
和
如果A和B输入均为1,则输出为1
用图形说明这一点
A B | Output
-------------
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1
A B | Output
-------------
0 0 | 0
0 1 | 1
1 0 | 1
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
因此,通过使用和,我们现在有了一种检查字节中单个位的值为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 | 0
1 0 | 0
1 1 | 1
A B | Output
-------------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
例如:
如您所见,位置4处的位已设置
然而,为了回答这一切的根本问题,在VB中不能使用分辨率小于1字节的数据类型,我怀疑如果您需要绝对位精度,我猜您一定在编写压缩算法或某种加密系统。:-) 01010100 011110010 01110101 011001001001,是单词“TRUE”的字符串值 您想要的是将信息存储在布尔值中
Dim v As Boolean
v = True
v = False
或
其他信息
从技术上讲,你不能在一个位中存储任何东西,最小的值是一个8位的字符。您需要学习如何进行逐位运算。或者使用该类。VB.NET(或我所知道的任何其他.NET语言)具有“位”数据类型。可以使用的最小值是字节
。(不是字符,大小为两个字节)。因此,尽管您可以读取值为84的字节并将其转换为值为1的字节(true),将值为101的字节转换为值为0的字节(false),但您并没有节省任何内存
现在,如果这些标志数量较少且固定,则可以将其中的几个标志存储在一种整数数据类型中(在.NET中,最大的整数数据类型是64位)。或者,如果您有大量这样的标志,您可以使用
位数组
类(它使用相同的技术,但使用数组来支持它,因此存储容量更大)。您需要澄清。在VB.NET中,True不是01010100 011110010 01110101 011001001001
。你是说你有一个整数(Int32)的程序,其值为1416787301
(或&H54727565
或01010100 011110010 011010101 011001001001
)当你在你的用户界面上显示它时,想把它转换成True
或1
吗?实际上我想做的是假设我有两个二进制值:一个是01010100,第二个是01100101。我想让第一个值(01010100)=1(位),第二个值(01100100101)=0(位)。现在告诉我该怎么做
if ((mybyte AND 16) >> 1) = 1 then
'Bit one is set
else
'Bit one is NOT set
end if
A B | Output
-------------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
00011001 OR 00000100 = 00011101
Dim v As Boolean
v = True
v = False
If number = 84 Then ' 84 = 01010100 = T
v = True
End If