Java语言、C语言或者其他语言中经常用到bit,所以本文不使用某一种语言作为例子。原点从0和1开始。按位运算主要有按位与(&)、按位或(|)、按位异或()、求反(~)、左移(:& gt)这
Java语言、C语言或者其他语言中经常用到bit,所以本文不使用某一种语言作为例子。原点从0和1开始。按位运算主要有按位与(&)、按位或(|)、按位异或()、求反(~)、左移(<>:& gt)这几类运算符,除了否定(~)都是二元运算符,即运算符的左右两边都需要一个操作数。
1,补码
在总结按位运算之前,有必要先介绍一下补码的知识。我们知道,十进制正整数转换成二进制数,只需要除以2,取余数即可。但是如何将十进制负整数转换成二进制数呢?其实负数是用补码的形式表示的,它的转换方式是,简单一句话:先用正数转换,然后加1代替。
要用二进制表示十进制-10,先用二进制表示10:
0000 0000 0000 1010
反转:
1111 1111 1111 0101
添加1:
1111 1111 1111 0110
所以-10的二进制表示是:1111 1111 1111 0110。
2。按位and (& )
运算中涉及的两个数转换成二进制(0,1)后,进行AND运算。只有对应位上的数字都是1时,这个位取1,否则应该是0。
逐位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执行按位XOR()运算:
0000 0000 0000 1010
1111 1111 1111 0110
———————–
1111 1111 1111 1100
所以:10-10 = 1111 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)后,进行左移运算,用于将一个数的所有二进制位向左移动若干位。
将10左移2位(相当于右加2个零):
0000 0000 0000 1010
——————–
0000 0000 0010 1000
所以:10<>
注意观察发现,左移一位的结果是原值乘以2,左移两位的结果是原值乘以4。
7。向右移动(>:& gt)
运算中涉及的两个数转换成二进制(0,1)后,进行右移运算,用于将一个数的所有二进制位向右移动若干位。
将10向右移动2位(相当于向左添加2个零):
0000 0000 0000 1010
——————–
0000 0000 0000 0010
so:10 >:>2 = 0000 0000 0000 0010 = 2
注意,我们可以观察到,右移一位的结果是原值除以2,左移两位的结果是原值除以4。注意,以后除了没有小数位的,都是四舍五入。