您的位置
主页 > 国内新闻 » 正文

位运算小结(按位与、按位或、按位异或、取反、左移、右移)

来源:www.zj-sanxiong.com.cn 点击:1544

位操作通常用于Java语言,C语言或其他语言,因此本文不是用某种语言修复的,原始点从0开始。位操作主要包括按位AND(&),按位或(|),按位XOR(^),反转(),左移(<<<<<<<<"),右移(>>)这些种类,除了否定(),都是双目运算符,也就是说,操作者在左侧和右侧都具有操作量。

1、补码

在总结按位运算之前,有必要介绍补码的知识。我们知道,当将十进制正整数转换为二进制数时,我们只需将方法除以2,但如何将十进制转换为二进制数?事实上,负数以补数的形式表示。转换它的简单方法是将其转换为正数,然后将其加1。

要以二进制表示十进制10,首先在二进制中使用10:

0000 0000 0000 1010

反转:

1111 1111 1111 0101

加1:

1111 1111 1111 0110

因此,-10的二进制表示为:1111 1111 1111 0110

2、按位与(&)

参与计算的两个数字被转换为二进制(0,1),并执行AND操作。仅当相应位上的数字为1时,该位才为1,否则为0。

在10和-10上执行按位AND(&)操作:

0000 0000 0000 1010

1111 1111 1111 0110

-----------------------

0000 0000 0000 0010

所以:10& -10=0000 0000 0000 0010

3、按位或(|)

参与操作的两个数字将转换为二进制(0,1),然后进行OR运算。只要相应位上有1,那么该位取1而且都不是1,即0。

在10和-10上执行按位或(|)运算:

0000 0000 0000 1010

1111 1111 1111 0110

-----------------------

1111 1111 1111 1110

所以:10 | -10=1111 1111 1111 1110

4、按位异或(^)

参与操作的两个数字将转换为二进制(0,1),然后进行异或。当相应位上的数字不相同时,这仅为1,如果它们相同则为0。

在10和-10上执行按位异或(^)运算:

0000 0000 0000 1010

1111 1111 1111 0110

-----------------------

1111 1111 1111 1100

所以:10 ^ -10=1111 1111 1111 1100

可以看出,任何数字与0进行异或,结果本身。使用XOR还可以实现良好的交换算法来交换两个数字。算法如下:

a=a ^ b;

b=b ^ a;

a=a ^ b;

5、取反(~)

参与该操作的两个数字被转换为二进制(0,1)然后被反转。每个位取相反的值,1变为0,0变为1.

反转()10:

0000 0000 0000 1010

---------------------

1111 1111 1111 0101

所以:~10=1111 1111 1111 0101

6、左移(<<)

参与该操作的两个数字被转换为二进制(0,1),并且执行左移位操作以将一个数字的所有数字向左移位几位。

向左移2位(相当于在右侧添加2 0):

0000 0000 0000 1010

--------------------

0000 0000 0010 1000

所以:10&lt; 2=0000 0000 0010 1000=40

注意,可以发现观察到向左移位一位的结果是将原始值乘以2,向左移位两位的结果是原始值乘以4。

7、右移(>>)

参与操作的两个数字被转换为二进制(0,1),并且执行右移操作以将一个数字的所有数字向右移位几位。

将2向右移2(相当于在左侧添加2到0):

0000 0000 0000 1010

--------------------

0000 0000 0000 0010

所以:10&gt;&gt; 2=0000 0000 0000 0010=2

注意,观察可以发现向右移位一位的结果是将原始值除以2,向左移位两位的结果是将原始值除以4.注意除了没有小数位,它们是四舍五入的。