符号:<< >> & | ^ ~
作用:用于二进制数据的操作
表达式: 表达式 + 运算符 + 表达式
~表达式或者是变量
优先级:~高于<< , >> 高于 & 高于 | ^
结合性:左结合
说明:
char a = 10
10 << 2 -- 0000 1010 -- 0010 1000
<<: 按位进行左移,把每个位都左移两个位置,在低位补0
左移几位就是乘2的几次方
10 >> 2 -- 0000 1010 -- 0000 0010
>> :无符号右移:按位进行右移,把每个位都右移两个位置,在高位补0
有符号右移:按位进行右移,把每个位都右移两个位置,在高位补符号位
右移几位就是除2的几次方
&:每个位都进行与,有0出0,全1出1
1000 1111
& 0100 0110
0000 0110
|:每个位都进行或,有1出1,全0出0
1000 1111
| 0100 0110
1100 1111
^:每个位都进行或,相同出0,不同出1
1000 1111
^ 0100 0110
1100 1001
~: 每个位都进行取反
1000 1111
~ 0111 0000
// 比如现在有一个32位的数据,你想要把第8位变为1,怎么做?
原始值:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
| 0x1 << 8
0000 0000 0000 0000 0000 0001 0000 0000
目标值:xxxx xxxx xxxx xxxx xxxx xxx1 xxxx xxxx
在没改变其他值的情况下,让第8位一定是1
//比如现在有一个32位的数据,你想要把第7和8位变为10,怎么做?
原始值:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
0x3 << 7
~ 0000 0000 0000 0000 0000 0001 1000 0000
& 1111 1111 1111 1111 1111 1110 0111 1111
xxxx xxxx xxxx xxxx xxxx xxx0 0xxx xxxx
0x2 << 7
| 0000 0000 0000 0000 0000 0001 0000 0000
目标值:xxxx xxxx xxxx xxxx xxxx xxx1 0xxx xxxx
//比如现在有一个32位的数据,你想知道32位的数据里第25位是0还是1,怎么做?
原始值:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
0x1 << 25
0000 0010 0000 0000 0000 0000 0000 0000
&
0000 00x0 0000 0000 0000 0000 0000 0000
下表列出了 C# 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
|------|------------------------------------------------------------------------------|-----------------------------------------------|
| 运算符 | 描述 | 实例 |
| & | (位与)有0出0,全1出1 | (A&B)将得到12,即为0000 1100 |
| | | (位或)有1出1,全0出0 | (A|B)将得到61,即为0011 1101 |
| ^ | (位异或)相同出0,不同出1 | (A^B)将得到49,即为0011 0001 |
| ~ | (位取反)每个位都进行取反 | (~A)将得到-61,即为1100 0011一个有符号二进制数的补码形式 |
| << | 按位进行左移,把每个位都左移两个位置,在低位补0 左移几位就是乘2的几次方 | A<<2将得到240,即为1111 0000 |
| >> | 无符号右移:按位进行右移,把每个位都右移两个位置,在高位补0 有符号右移:按位进行右移,把每个位都右移两个位置,在高位补符号位 右移几位就是除2的几次方 | A>>2将得到15,即为0000 1111,B>>2将得到3即为0000 0011 |
cs
namespace Demo位运算
{
internal class Program
{
static void Main(string[] args)
{
//int a = 4;
//int c= a << 3;
//Console.WriteLine(c);
int a = 16;
int b = a >> 4;
Console.WriteLine(b);
}
}
}