位操作运算

概述

        在计算机中,CPU对数据进行操作都是对二进制数据进行操作。例如以下代码

int a = 4;
int b = 5;
int c = a + b;

        实际上在CPU中是以二进制数据进行操作,所以在代码中使用位运算符能够提高代码执行效率。

+  a    0000 0100   4
   b    0000 0101   5
  -----------------
   c    0000 1001   9

位运算符

        位运算符有6种,各个运算符符号,描述和预算规则如下表:

符号描述运算规则
&两个都为1时,结果为1
|两个都为0时,结果为0
^异或两个相同为0,不同为1
~      取反0取1,1取0
<<左移所有位左移若干位,低位补0
>>右移所有位右移若干位,高位补0(有符号位一般高位补符号位

&与运算符

                            0&0=0  0&1=0  1&0=0  1&1=1

          结论:两位同时为1,结果为1,否则结果为0。 例如:3&5即 0000 0011& 0000 0101 = 0000 0001,因此 3&5 的值得1。 与运算应用:

        (1)清零:如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

        (2)取数:如果想要取出某个数的某几位,只需要将这个数和一个这几位为1,其余为0的数相与。例如:要取0110 1110的后四位,只需要将这个数和0000 1111相与得到的结果0000 1110就是想取数的后四位。

         (3)判断奇偶:奇偶数只用判断最后是否为1即可所以只用将数a&1==0即可判断是否为偶数。

|或运算符

                            0|0=0  0|1=1  1|0=1  1|1=1

           结论:两位只要有1位为1,结果为1,否则结果为0。 例如:3|5即 0000 0011| 0000 0101 = 0000 0111,因此 3|5 的值得7。 或运算应用:         

        (1)置1:如果想要将某个数的某几位设置为1,只需要将这个数和一个这几位为1,其余为0的数相或。例如:要将1011 1100的后四位设置为1,只需要将这个数和0000 1111相或得到结果为1011 1111就是想要的结果。

^异或运算符

                            0^0=0  0|1=1  1|0=1  1|1=0

           结论:两位只要相同为0,不同为1。 例如:3^5即 0000 0011^ 0000 0101 = 0000 0110,因此 3^5 的值得6。 异或运算应用:

        (1)翻转:如果想要将某个数的某几位翻转,只需要将这个数和一个这几位为1,其余为0的数相异或。例如:要将1011 1100的后四位翻转,只需要将这个数和0000 1111相异或得到结果为1011 0011就是想要的结果。

        (2)与0相异或值不变。例如1011 1101 ^ 0000 0000 = 1011 1101。

异或的几条性质:

  • 1、交换律
  • 2、结合律 (a^b)^c == a^(b^c)
  • 3、对于任何数x,都有 x^x=0,x^0=x
  • 4、自反性: a^b^b=a^0=a;

~取反运算符

                                ~0=1  ~1=0

           结论:0变1,1变0。 取反运算应用:

         (1)最低位置0:使a的最低位为0,可以表示为:a & ~1。对1取反就是最后一位变为0,其他位变1 ,再和a相与,就是a的最后一位为0,其他位不变。

<<左移运算符

        定义:将一个数据的所有二进制位向左移动若干位,移动规则为:左边的高位丢弃,右边的二进制位补0。例如对一个数 a = 0011 1010 ,对a进行 a= a<<2;则得到的a就是a=1110 1000。如果在向左移动的过程中,舍弃的高位没有1,则每向左移动一位,相当于将原来的数乘以2。

>>左移运算符

        定义:将一个数据的所有二进制位向右移动若干位,移动规则为:右边的低位丢弃,左边的二进制位补0。例如对一个数 a = 0011 1010 ,对a进行 a= a>>2;则得到的a就是a=0000 1110。如果在向右移动的过程中,每向右移动一位,相当于将原来的数除以2。注意如果是无符号数据:最左边的二进制位补0,如果是有符号的二进制位,最左边的二进制位补符号位,原来是多少就补多少。

对菜鸟教程的博客进行了整理:位运算(&、|、^、~、>>、 | 菜鸟教程 (runoob.com)

C#提供了许多位操作运算符,它们可以用于对二进制位进行操作,这些运算符包括: 1. 按位与(&):将两个操作数的每一位进行与运算,如果对应位都为1,则结果为1,否则为0。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = 3; // 二进制表示为 00000011 int c = a & b; // c 的值为 00000001,即 1 ``` 2. 按位或(|):将两个操作数的每一位进行或运算,如果对应位都为0,则结果为0,否则为1。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = 3; // 二进制表示为 00000011 int c = a | b; // c 的值为 00000111,即 7 ``` 3. 按位异或(^):将两个操作数的每一位进行异或运算,如果对应位相同,则结果为0,否则为1。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = 3; // 二进制表示为 00000011 int c = a ^ b; // c 的值为 00000110,即 6 ``` 4. 按位取反(~):将操作数的每一位进行取反运算,即0变成1,1变成0。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = ~a; // b 的值为 11111010,即 -6(注意这里是有符号的整数) ``` 5. 左移(<<):将操作数的所有位向左移动指定的位数,右侧用0填充。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = a << 2; // b 的值为 00010100,即 20 ``` 6. 右移(>>):将操作数的所有位向右移动指定的位数,左侧用符号位填充(即如果操作数是正数,则左侧用0填充,如果是负数,则左侧用1填充)。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = a >> 2; // b 的值为 00000001,即 1 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值