IRONSOFTWAREHOME

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

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

Tim Corey

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;
C#

没有前缀,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
C#

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
C#

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
C#

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);
C#

这与为何选择正确的类型大小很重要有关。 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#中理解二进制的更多见解。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户