逻辑运算符 & 位运算符

未分类
2k 词

会当凌绝顶,一览众山小。 ——杜甫《望岳》

逻辑运算符

逻辑运算符用于对布尔值进行逻辑运算,并且也会返回一个布尔值。逻辑运算符主要有如下四种

逻辑与 &&
  • 当且仅当两个操作数都为 true 时,结果才会返回 true,其余情况均会返回 false
1
2
3
4
byte x = 20;
byte y = 12;
Console.WriteLine(x<y && x>y); // 输出False,因为 x<y 为false
Console.WriteLine(x>y && x!=y); // 输出True,因为 x>y 与 x!=y 均为true
逻辑或 ||
  • 只要两个操作数中有一个为 true,结果就会返回 true;只有当两者均为 false 时,结果才会返回 false
1
2
3
4
bool result_1 = 20!=10 || 20<10;   // 20!=10为true,20<10为false,最终返回true
bool result_2 = 20<3 || 20==4; // 20<3与20==4均为false,最终返回false
Console.WriteLine(result_1); // True
Console.WriteLine(result_2); // False
逻辑非 !
  • 对操作数的布尔值取反
1
2
3
int x=30,y=13;
Console.WriteLine(!(x!=y || x<y)); // Flase
Console.WriteLine(!(x==y && x>y)); // Ture
逻辑异或 ^
  • 当两个操作数的布尔值不同时,结果返回 true,否则返回 false
1
2
3
bool a=true,b=false,c=true;
Console.WriteLine(a ^ b); // True
Console.WriteLine(a ^ c); // Flase




位运算符

在 C# 中,位运算符直接对整型的二进制位进行操作,并逐位运算。如下是 C# 当中的一些位运算符:

按位与 &
  • 对两个操作数的二进制形式的每一位进行判断,只有当两个对应位都为1时,结果才会在这一位上标记为1,其余情况均为0。操作完成后该运算符会返回一个十进制数,这个数的二进制形式上为1的位就代表两个操作数的二进制形式在这一位上都为1,反之亦然
1
2
3
int a = 87;  // 二进制形式:0101 0111(简化为8位,实际为32位)
int b = 89; // 二进制形式:0101 1001
int result = a & b; // 返回十进制数81,其对应的二进制形式为 0101 0001(这里简化为8位)
按位或 |
  • 类似于 & 运算符,不过 | 运算符会对对应的二进制位进行或运算,即只要两个对应位中有一个为1,结果就会在这一位上标记为1,否则为0
1
2
3
int x = 23;   // 二进制形式:0001 0111(简化为8位,实际为32位)
int y = 34; // 二进制形式:0010 0010
int result = x | y; // 返回十进制数55,其对应的二进制形式为 0011 0111(这里简化为8位)
按位异或 ^
  • 类似地,^ 运算符会对对应的二进制位进行异或运算,即当两个对应位不同时,结果就会在这一位上标记为1,否则为0
1
2
3
byte a = 12;   // 二进制形式:0000 1100
byte b = 9; // 二进制形式:0000 1001
byte result = a ^ b; // 返回十进制数5,其对应的二进制形式为 0000 0101(这里简化为8位)
按位取反 ~
  • ~ 运算符是一元运算符,用于对操作数的每个二进制位取反 (1变0,0变1)
  • 因为 C# 中整型的最高位是符号位,所以取反后结果可能为负数
1
2
int a = 5;  // 二进制形式:0000 0101(32位完整表示:0000 ... 0101)
int result = ~a; // 返回十进制数-6,其对应的二进制形式为 1111 ... 1010
左移 <<
  • 将第一个操作数的二进制位向左移动指定的位数(第二个操作数指定移动位数),右侧空出的位补0
  • 在不溢出的情况下,a << n 等价于 a * (2^n)
1
2
int a = 5;    // 二进制形式:0000 0101
int result = a << 2; // 返回十进制数20 (5 * 2²=20),其对应的二进制形式为 0001 0100
右移 >>
  • 将第一个操作数的二进制位向右移动指定的位数(第二个操作数指定移动位数)
  • 对于无符号整数,左侧空出的位一律补0
  • 对于负整数,该运算符会先将其转化为补码的形式,再进行右移操作,左侧空位一律补1,最后将补码转化为十进制数并返回
1
2
3
4
5
int a = 20;   // 二进制形式:0001 0100
int result_1 = a >> 2; // 返回十进制数5,其对应的二进制形式为 0000 0101

sbyte b = -12; // 补码:1111 0100
int result_2 = b >> 2; // 返回十进制数-3,其对应的补码为 1111 1101