跳至页脚内容
Iron Academy Logo
学习 C#
学习 C#

其他类别

在C#中存储和显示二进制值

[[academy-video-youtube({"vid": "xkZa6IyqNwg", "start_time": "0", "title": "在C#中存储和显示二进制值", "creator": "Tim Corey", "length": "9m 20s"})]]

二进制是计算机实际存储和处理数据的方式,但C#默认以10进制显示屏幕上一切内容。 如果您正在处理位标志、网络协议、硬件寄存器,或者只是想了解机器层面上数字的表示方式,您需要知道如何在C#中获取二进制值并以可读格式显示。

在他的视频《在C#中存储和显示二进制值》中,Tim Corey讲述了他的二进制系列中的第三课。 他演示了如何使用0b前缀存储二进制文字,如何使用Convert.ToString()将整数转换为二进制字符串表示,并如何通过在输出前填充零来实现整齐的格式化。 如果您在跟随二进制系列或在C#中处理低级别数据,这涵盖了实际的机械操作。

在C#中存储二进制字面量

[0:00 - 1:50] Tim解答的第一个问题很简单:如何将二进制数字放入C#变量中? 答案是0b前缀,它告诉编译器将这些数字解释为以2为基数而不是默认的10为基数。

// Store binary 1001 (which is 9 in decimal)
int binaryValue = 0b1001;
// Store binary 1001 (which is 9 in decimal)
int binaryValue = 0b1001;

没有前缀,1001将被解释为一千零一。 使用0b,它被视为四个二进制数字,代表十进制值9。前导零是可选的。 写成0b00001001与0b1001相同,但较长的形式可以让您在处理特定比特宽度时更容易读取比特位置。

变量类型是标准的int。 如果不需要负值,可以使用uint(无符号整数),或使用long用于64位存储。 二进制文字语法适用于任何整数字类型。

以二进制显示数字

[1:50 - 3:48] 存储二进制值是一回事。 在屏幕上作为二进制查看是另一回事。 当您使用Console.WriteLine打印int时,C#输出的是十进制表示。 对于0b1001,这意味着您看到的是9,而不是1001。

要获取二进制字符串表示,请使用Convert.ToString()并指定一个基数参数:

int binaryValue = 0b1001;

// Convert to binary string (base 2)
string representation = Convert.ToString(binaryValue, 2);

Console.WriteLine($"Base 10: {binaryValue}");      // Output: 9
Console.WriteLine($"Base 2: {representation}");     // Output: 1001
int binaryValue = 0b1001;

// Convert to binary string (base 2)
string representation = Convert.ToString(binaryValue, 2);

Console.WriteLine($"Base 10: {binaryValue}");      // Output: 9
Console.WriteLine($"Base 2: {representation}");     // Output: 1001

Convert.ToString()的第二个参数指定输出基数。 支持的值有2(二进制)、8(八进制)、10(十进制)和16(十六进制)。 Tim展示了以2为基数的方法,但相同的方法处理这四种。

用前导零填充

[3:48 - 5:24] Convert.ToString(binaryValue, 2)的原始输出省略了前导零。 对于0b1001,结果是字符串"1001",而不是"00001001"。 当您使用字节(8位)、16位值或32位寄存器时,看到全宽带前导零会立即清楚显示比特位置。

修复是PadLeft()

// Pad to 8 characters (one byte) with leading zeros
string padded = Convert.ToString(binaryValue, 2).PadLeft(8, '0');

Console.WriteLine(padded);  // Output: 00001001
// Pad to 8 characters (one byte) with leading zeros
string padded = Convert.ToString(binaryValue, 2).PadLeft(8, '0');

Console.WriteLine(padded);  // Output: 00001001

PadLeft(8, '0')确保输出至少为8个字符长,用字符'0'填补左边的任何缺失位置。 Tim指出一个细节,第二个参数是一个字符(单引号),而不是一个字符串。 这是字符零,不是数字零,因为PadLeft是从单个字符构建字符串。

对于16位表示,将8改为16。对于完整的32位整数,使用32。填充宽度应与您所考虑的比特宽度匹配。

将任何整数转换为二进制

[5:24 - 7:28] Tim指出一个容易忽视的点:您不需要将值存储为二进制文字就能看到其二进制表示。 任何整数都可以使用相同的Convert.ToString()方法转换为二进制输出:

// A regular base 10 integer
int decimalValue = 12;

// Convert to padded binary string
string binary = Convert.ToString(decimalValue, 2).PadLeft(8, '0');

Console.WriteLine($"Decimal: {decimalValue}");  // Output: 12
Console.WriteLine($"Binary: {binary}");          // Output: 00001100
// A regular base 10 integer
int decimalValue = 12;

// Convert to padded binary string
string binary = Convert.ToString(decimalValue, 2).PadLeft(8, '0');

Console.WriteLine($"Decimal: {decimalValue}");  // Output: 12
Console.WriteLine($"Binary: {binary}");          // Output: 00001100

0b前缀用于当您已经有一个二进制值并希望以二进制形式输入它时。 对于常规整数,Convert.ToString()负责处理转换。 两种途径对于相同的底层值产生相同的结果。

C#在内存中存储整数的方式

[7:28 - 9:20] Tim 以关于C#如何内部存储整数的细节来结束。 在C#中,int是System.Int32的别名,一个32位有符号整数。 这意味着每个int在内存中占用32位,不管值有多小。 存储0b1001(数字9)使用32位与存储0b01111111111111111111111111111111(超过二十亿)相同。

// What's actually stored in memory for binaryValue = 0b1001
// 00000000 00000000 00000000 00001001
string fullRepresentation = Convert.ToString(binaryValue, 2).PadLeft(32, '0');
Console.WriteLine(fullRepresentation);
// What's actually stored in memory for binaryValue = 0b1001
// 00000000 00000000 00000000 00001001
string fullRepresentation = Convert.ToString(binaryValue, 2).PadLeft(32, '0');
Console.WriteLine(fullRepresentation);

这与为何选择正确的类型大小很重要有关。 long (Int64)使用64位,内存占用加倍。 对于大多数应用程序,int (32位)涵盖了您所需的范围。 但如果您在内存受限的环境中工作或处理数百万个值,那么字节(8位)、短整型(16位)、int(32位)和长整型(64位)之间的差异就变得很重要。

总结:完整的模式

[9:07 - 9:15] 在C#中使用二进制的完整模式是简洁的。用0b前缀存储值当您有二进制输入时。 使用Convert.ToString(value, 2)显示它们以获得原始输出。 当需要固定宽度格式化时,添加.PadLeft(width, '0')。 并记住,底层存储始终是一个标准整数类型,其比特宽度由您选择的字节、short、int或long决定。

结论

[9:15 - 9:20] 总结一下:二进制文字使用0b前缀,PadLeft()为固定宽度显示添加前导零。 值在底层存储于常规整数类型中,int始终占用32位,不管数字的大小如何。

这些构建块在本系列的下一课中出现,二进制值需要以适当的格式进行位运算。

示例提示:调试位运算时,将您的二进制输出填充到类型的全宽(字节为8,short为16,int为32)。 一次看到所有的比特位置使得移位和遮罩操作更容易跟踪。 像string ToBinary(int val) => Convert.ToString(val, 2).PadLeft(32, '0');这样的辅助方法节省了重复输入。

在他的YouTube频道上观看完整视频,获得关于在C#中理解二进制的更多见解。

Hero Worlddot related to 在C#中存储和显示二进制值
Hero Affiliate related to 在C#中存储和显示二进制值

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我