C# 使用 位运算 按字节提取整数
【案例说明】
本案例主要介绍按位运算符和移位运算符的用法。案例从控制台输入一个十进制整数,然后将其转换成十六进制数并从控制台输出,接着提取该整数的每一字节所表示的十六进制数值,最后从控制台逐一输出。
【实现过程】
(1)创建一个名为 Logic 的控制台应用程序。
(2)从控制台输入一个十进制整数,在 main 函数中添加代码如下:
Console.WriteLine(「请输入一个整数:」);
int Number = int.Parse(Console.ReadLine()); //从控制台输入一个十进制整数
Console.WriteLine(「{0}的十六进制形式为 0x{1:X8}」, Number, Number);
(3)按字节提取整数每一字节的值,代码如下:
int NumberHex = Number & 0x000000FF; //将数值与 0xFF 按位与运算
Console.WriteLine(「第 1 个字节为:0x{0:X2}」, NumberHex); //十六进制输出第 1 字节
NumberHex = Number >> 8 & 0x000000FF; //将数值右移 8 位与 0xFF 按位与运算
Console.WriteLine(「第 2 个字节为:0x{0:X2}」, NumberHex); //十六进制输出第 2 字节
NumberHex = Number >> 16 & 0x000000FF; //将数值右移 16 位与 0xFF 按位与运算
Console.WriteLine(「第 3 个字节为:0x{0:X2}」, NumberHex); //十六进制输出第 3 字节
NumberHex = Number >> 24 & 0x000000FF; //将数值右移 24 位与 0xFF 按位与运算
Console.WriteLine(「第 4 个字节为:0x{0:X2}」, NumberHex); //十六进制输出第 4 字节
【代码解析】
案例代码中首先从控制台输入一个十进制整数 Number,然后将其按十六进制的形式输出,接着提取 Number 的 4 字节。案例代码中用到了按位与运算符「&」和右移位运算符「>>」。当一个整型数值与十六进制数 0xFF 进行按位与运算时,剩下的就是第一字节,其中 0xFF 表示的是十六进制数 FF,「0x」是十六进制数的前缀。因为每字节有 8 个二进制位,提取第二字节时利用右移位运算符「>>」将 Number 右移 8 位,高位用 0 或 1 填充,低位自动丢失,此时第二字节移到了第一字节的位置,再将其与 0xFF 进制进行按位与运算,这样就提取了第二字节,同理,可提取第三和第四字节。
常用的按位运算符按位与运算符「&」、按位或运算符「|」和按位异或运算符「^」。
注意:这三个运算符对于整数类型来说,是按位运算符;对于布尔类型来说,就是逻辑运算符。
常用的移位运算符有左移位运算符「<<」和右移位运算符「>>」。
注意:当进行左移位时,高位自动丢失,低位用零填充;进行右移位时,低位自动丢失,正数高位用 0 填充,负数高位用 1 填充。