Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net I';我对VisualBasic不太熟悉,正在尝试理解如何在一个字节中设置单个位_Vb.net_Binary - Fatal编程技术网

Vb.net I';我对VisualBasic不太熟悉,正在尝试理解如何在一个字节中设置单个位

Vb.net I';我对VisualBasic不太熟悉,正在尝试理解如何在一个字节中设置单个位,vb.net,binary,Vb.net,Binary,大家好,我是VisualBasic新手,我有一个项目,需要能够操作值中的各个位 我需要能够在1和0之间切换这些位,并在代码中将多次出现的位组合成一个变量 每一位都代表一个真/假值,所以我不是在寻找如何在一个变量中实现一个真/假值,而是在一个变量中实现多个真/假值 请有人解释一下我是如何做到这一点的 非常感谢。它必须精确到一位吗 为什么不使用实际的内置VB数据类型Boolean来实现这一点呢 它存在的唯一原因是,您可以定义具有两种状态的变量,true或false Dim myVar As Boo

大家好,我是VisualBasic新手,我有一个项目,需要能够操作值中的各个位

我需要能够在1和0之间切换这些位,并在代码中将多次出现的位组合成一个变量

每一位都代表一个真/假值,所以我不是在寻找如何在一个变量中实现一个真/假值,而是在一个变量中实现多个真/假值

请有人解释一下我是如何做到这一点的


非常感谢。

它必须精确到一位吗

为什么不使用实际的内置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