C#左移和右移运算符的用法(附带实例)
C# 中的移位运算符有两个,分别是左移位 << 和右移位 >>,这两个运算符都是双目运算符,它们主要用来对整数类型的数据进行移位操作。
移位运算符的右操作数不可以是负数,并且要小于左操作数的位数。下面分别对左移位<<和右移位>>进行讲解。
左移位运算相当于乘以 2 的 n 次幂。例如,int 类型数据 48 对应的二进制数为 00110000,将其左移 1 位,根据左移位运算符的运算规则,可以得出(00110000<<1)=01100000,所以转换为十进制数就是 96(48×2);将其左移 2 位,根据左移位运算符的运算规则,可以得出(00110000<<2)=11000000,所以转换为十进制数就是 192(48×22)。
右移位运算相当于除以 2 的 n 次幂。正数 48 右移 1 位的运算过程如下图所示:

图 2 正数的右移位运算过程
负数 -80 右移 2 位的运算过程如下图所示:

图 3 负数的右移位运算过程
移位运算符的右操作数不可以是负数,并且要小于左操作数的位数。下面分别对左移位<<和右移位>>进行讲解。
C#左移位运算符<<
左移位运算符 << 是将一个二进制操作数向左移动指定的位数,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用 0 补充。左移位运算相当于乘以 2 的 n 次幂。例如,int 类型数据 48 对应的二进制数为 00110000,将其左移 1 位,根据左移位运算符的运算规则,可以得出(00110000<<1)=01100000,所以转换为十进制数就是 96(48×2);将其左移 2 位,根据左移位运算符的运算规则,可以得出(00110000<<2)=11000000,所以转换为十进制数就是 192(48×22)。
// 定义一个int类型的变量并赋值为48 int number = 48; Console.WriteLine("原始数值(十进制):" + number); // 将48对应的二进制数00110000左移1位 int shifted1 = number << 1; Console.WriteLine("左移1位后的结果(十进制):" + shifted1 + "(相当于 " + number + " * 2)"); // 将48对应的二进制数00110000左移2位 int shifted2 = number << 2; Console.WriteLine("左移2位后的结果(十进制):" + shifted2 + "(相当于 " + number + " * 2^2)"); // 暂停程序,等待用户输入,以便查看输出结果 Console.ReadLine();运行结果为:
原始数值(十进制):48
左移1位后的结果(十进制):96(相当于 48 * 2)
左移2位后的结果(十进制):192(相当于 48 * 2^2)

图 1 左移位运算
C#右移位运算符>>
右移位运算符 >> 是将一个二进制操作数向右移动指定的位数,右边(低位端)溢出的位被丢弃,而在填充左边(高位端)的空位时,如果最高位是 0(表示正数),左侧空位填入 0;如果最高位是 1(表示负数),左侧空位填入 1。右移位运算相当于除以 2 的 n 次幂。正数 48 右移 1 位的运算过程如下图所示:

图 2 正数的右移位运算过程
负数 -80 右移 2 位的运算过程如下图所示:

图 3 负数的右移位运算过程
// 定义一个正数int类型的变量并赋值为48 int positiveNumber = 48; Console.WriteLine("原始正数值(十进制):" + positiveNumber); // 将48对应的二进制数00110000右移1位 int positiveShifted1 = positiveNumber >> 1; Console.WriteLine("正数右移1位后的结果(十进制):" + positiveShifted1 + "(相当于 " + positiveNumber + " / 2)"); // 定义一个负数int类型的变量并赋值为-80 int negativeNumber = -80; Console.WriteLine("原始负数值(十进制):" + negativeNumber); // 将-80对应的二进制数(以32位为例)11111111 11111111 11110000 00100000右移2位 int negativeShifted2 = negativeNumber >> 2; Console.WriteLine("负数右移2位后的结果(十进制):" + negativeShifted2 + "(相当于 " + negativeNumber + " / 2^2)"); // 暂停程序,等待用户输入,以便查看输出结果 Console.ReadLine();运行结果为:
原始正数值(十进制):48
正数右移1位后的结果(十进制):24(相当于 48 / 2)
原始负数值(十进制):-80
负数右移2位后的结果(十进制):-20(相当于 -80 / 2^2)