C# 位运算 位操作 教程

 


在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。

 

C# 中支持的位操作符号有:

 

运算符号
意义
运算对象类型
运算结果类型
对象数
实例
~
按位取反运算
整型,字符型
整型
1
~a
&
位逻辑 运算
2
a & b
|
位逻辑 运算
2
a | b
^
位逻辑 异或运算
2
a ^ b
<<
左移运算
2
a<<4
>>
右移运算
2
a>>2

 

下面详细介绍每个位运算的操作。

 

1. 按位取反操作 ~

按位取反操作会将整个变量的所有位都进行取反,包括符号位。

 class Program
    {
        static void Main(string[] args)
        {
            int number = 5;
            number = ~number;
            Console.WriteLine(number);

            int k = -5;
            number = ~k;
            Console.WriteLine(number);
        }
    }


 

输出为:

-6

4

 

举例:  在C#中int 类型占4个字节, 5 的二进制码为:

0000 0000 0000 0000 0000 0000 0000 0101


 

按位取反后的二进制码为:

1111 1111 1111 1111 1111 1111 1111 1010


 

这个二进制码对应内存中存储的补码,让这个二进制码减去1,得到表示数字的反码:

1111 1111 1111 1111 1111 1111 1111 1001


由这个反码即可获得源码,请注意,最左边的为符号位,在活的原码的时候符号位不取反:

1000 0000 0000 0000 0000 0000 0000 0110


 

这个数在内存中即为 -6。

 

同样,-5在内存中的原码为:

1000 0000 0000 0000 0000 0000 0000 0101

获得反反码为:

1111 1111 1111 1111 1111 1111 1111 1010


补码为:

1111 1111 1111 1111 1111 1111 1111 1011


这个补码按位取反以后为:

0000 0000 0000 0000 0000 0000 0000 0100

在内存中即为 4.

 


2、位逻辑与运算 &

注意:符号位同样参加按位与操作。

位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 
比如:10010001(二进制)&11110000等于10010000(二进制)。
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            int c = a & b;
            Console.WriteLine(c);
        }
    }


 

a 为:

0000 0000 0000 0000 0000 0000 0000 0001


b 为:

0000 0000 0000 0000 0000 0000 0000 0010


按位与以后为:

0000 0000 0000 0000 0000 0000 0000 0000

 

下面举例当符号位参与操作的情况:

 

        static void Main(string[] args)
        {
            int a = -2147483647;
            int b = 1;
            int c = a & b;
            Console.WriteLine(c);
        }


a:

1000 0000 0000 0000 0000 0000 0000 0001

a的原码为:

1111 1111 1111 1111 1111 1111 1111 1111


b的二进制:

0000 0000 0000 0000 0000 0000 0000 0001


按位与以后还是:

0000 0000 0000 0000 0000 0000 0000 0001



3、位逻辑或运算 |

同上,同样包含符号位操作。

位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,
0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。
 
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            int c = a | b;
            Console.WriteLine(c);
        }
    }

a 为:

0000 0000 0000 0000 0000 0000 0000 0001


b 为:

0000 0000 0000 0000 0000 0000 0000 0010


按位与以后为:

0000 0000 0000 0000 0000 0000 0000 0000

a 为:

0000 0000 0000 0000 0000 0000 0000 0001


b 为:

0000 0000 0000 0000 0000 0000 0000 0010


按位或以后为:

0000 0000 0000 0000 0000 0000 0000 0011

 

4、位逻辑异或运算 ^

同上,同样包含符号位操作。

位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,
1异或0等于1,0异或0等于0。即:相同得0,相异得1。
比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。

 

5、位左移运算 <<

同上,同样包含符号位操作。

位左移运算将整个数按位左移若干位,左移后空出的部分0。比如:8位的byte型变量
byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。
 
        static void Main(string[] args)
        {
            int a = -2147483647;
            a = a << 2;
            Console.WriteLine(a);
        }

a 的二进制:
0000 0000 0000 0000 0000 0000 0000 0100

左移两位以后,符号位丢失:

 
0000 0000 0000 0000 0000 0000 0000 0100
即为4.
 
 

6、位右移运算 >>

 

同上,同样包含符号位操作。

位右移运算将整个数按位右移若干位,右移后空出的部分填0。比如:8位的byte型变量
Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值