C# 中的按位运算






4.57/5 (19投票s)
2001 年 11 月 7 日
4分钟阅读

298966

2
在 C# 中使用按位运算符。
引言
C# 在位操作方面具有很大的灵活性。在开始解释位操作之前,我想先介绍一下二进制运算。
二进制数
仅用两个符号就可以表示您想要的任何类型的信息,这些符号可以是 {a,b}、{0,1} 或摩尔斯电码的 {嘀、嘀嘀嘀}。当您想处理布尔值(1)表达式或在一个字节(8 位一组)中存储多个值时,将这些字节表示为二进制数会更方便。
二进制数对于构建位掩码(与布尔运算符(AND、OR、XOR、NOT)一起使用)是特别需要的。换句话说,235 是 128+64+32+8+2+1 的和。二进制数看起来很长,但计算机处理起来要容易得多,因为每个位或二进制数字都可以由一个电信号表示,该信号要么是开(on)要么是关(off)。
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
1 |
1 |
0 |
1 |
0 |
使用上表,您可以看到十进制数 11010 等于十进制系统中的 26。(16+8+2=26)- 如果您想检查,请使用顶部的基数转换器将 26 转换为二进制。
使用二进制记数法是数值时钟(Numerical Hour)的一个很好的练习,因为原理可以快速教授 - 此外,还可以快速进行一些非常有趣的数学运算 - 例如:
要将任何数字除以二,只需将数字向右移动 1 位:101100 = 44,10110 = 22
(如果存在小数部分会怎样?你能制定一个规则吗?)
要将数字加倍,只需在末尾加一个零:1111 = 15,11110 = 30
我将要讨论的一些重要的二进制运算如下:
- AND 运算
- OR 运算
- 移位运算
我们知道,在二进制中,所有的 1 都表示真,0 都表示假。
当对二进制值执行 AND 运算时,结果如下。
以下是 AND 运算的真值表。
A |
B |
AND |
0(假) |
0(假) |
0(假) |
1(真) |
0(假) |
0(假) |
0(假) |
1(真) |
0(假) |
1(真) |
1(真) |
1(真) |
*当使用 AND 运算时,只有当两个值都为真时,结果才为真。
在 C# 中,使用‘&’运算符来实现 AND 运算。
现在我们来看第一个程序
程序 1
using System;
class MyClass {
public static void Main() {
byte varA=10;// binary equivalent for 10 is 01010
byte varB=20;// binary equivalent for 20 is 10100
long result=varA & varB; // AND operation result should be 00000
Console.WriteLine("{0} AND {1} Result :{2}",varA,varB,result);
varA=10;// binary equivalent for 10 is 01010
varB=10;// binary equivalent for 10 is 01010
result=varA & varB; // AND operation result should be 01010
//so the result will contain 10 in decimal
Console.WriteLine("{0} AND {1} Result : {2}",varA,varB,result);
}
}
程序输出
C:\csharp\progs>bitprg1
10 AND 20 Result :0
10 AND 10 Result : 10
当对二进制值执行 OR 运算时,结果如下。
以下是 AND 运算的真值表。
A |
B |
或者 |
0(假) |
0(假) |
0(假) |
1(真) |
0(假) |
1(真) |
0(假) |
1(真) |
1(真) |
1(真) |
1(真) |
1(真) |
*当使用 OR 运算时,只有当两个值都为假时,结果才为假。在所有其他情况下,OR 运算的结果为真。
在 C# 中,使用‘|’运算符来实现 OR 运算。
现在我们来看第一个程序
程序 2
using System;
class MyClass {
public static void Main() {
byte varA=10;// binary equivalent for 10 is 01010
byte varB=20;// binary equivalent for 20 is 10100
long result=varA | varB; // OR operation result should be 11110
//so the result will contain 30 in decimal
Console.WriteLine("{0} OR {1} Result :{2}",varA,varB,result);
varA=10;// binary equivalent for 10 is 01010
varB=10;// binary equivalent for 10 is 01010
result=varA | varB; // OR operation result should be 01010
//so the result will contain 10 in decimal
Console.WriteLine("{0} OR {1} Result : {2}",varA,varB,result);
}
}
程序输出
C:\csharp\progs>bitprg2
10 OR 20 Result :30
10 OR 10 Result : 10
移位运算有两种:右移和左移。
- 右移运算用于将位向右移动。
- 左移运算用于将位向左移动。
当对二进制值执行右移运算时,位会向右移动一个位置。
举个例子
十进制值 10 的二进制等效值为 1010。因此,当对该值执行右移运算时,所有位将向右移动一个位置,最右边的位将被截断,最左边的位将用零填充。
1010 右移一位后,其值为 0101
因此,0101 的十进制等效值为 5。这意味着当十进制值 10 向右移动一位时,其值会减小到 5。
在 C# 中,使用‘>>’运算符来实现右移运算。
现在我们来看第一个程序
程序 3
using System;
class MyClass {
public static void Main() {
byte varA=10;// binary equivalent for 10 is 01010
long result=varA >> 1; // Right Shift operation result should be 0101
//so the result will contain 5 in decimal
Console.WriteLine("{0} is Right Shifted to 1 position Result :{1}",
varA,result);
}
}
程序输出
C:\csharp\progs>bitprg3
10 is Right Shifted to 1 position Result :5
当对二进制值执行左移运算时,位会向左移动一个位置。
举个例子
十进制值 10 的二进制等效值为 1010。
因此,当对该值执行左移运算时,所有位将向左移动一个位置,最左边的位将被截断,最右边的位将用零填充。1010 向右移动一位后,其值为 10100。
因此,10100 的十进制等效值为 20。这意味着当十进制值 10 向左移动一位时,其值会增加到 20。
在 C# 中,使用‘<<’运算符来实现左移运算。
现在我们来看第一个程序
程序 4
using System;
class MyClass {
public static void Main() {
byte varA=10;// binary equivalent for 10 is 01010
long result=varA << 1; // Left Shift operation result should be 10100
//so the result will contain 20 in decimal
Console.WriteLine("{0} is Left Shifted to 1 position Result :{1}",
varA,result);
}
}
程序输出
C:\csharp\progs>bitprg4
10 is Left Shifted to 1 position Result :20
深入阅读
- .NET .NET 技术更多信息