首先我们要知道什么是二进制:
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数组计算机智能识别和处理由'0','1'符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号'0','1'的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易用于电子方式实现。
---------------以上来自百度百科
我们先要知道使用位运算的好处是什么,因为在计算机中所有的数据都是以二进制的形式储存和计算的,所以对于一些数据的处理,计算机是先将其转换成二进制进行处理,然后再转换成所需要的数据类型输出的。而位运算是直接以二进制的形式进行计算的,可以免去中间的转换过程,从而提高运行速度。
对于进制与进制之间的转换过程这里就不说了。首先位运算符有以下六种:
按位与:& 按位或:| 按位异或:^
按位取反:~ 右移:>> 左移:<<
这里我们就拿4和6来举例,4的二进制是0000 0100,6的二进制是0000 0110
对于&来说当两个都为1的时候才为1,否则都为0
对于 | 来说当两个都为0的时候才为0,否则都为1
对于 ^来说当两个相同的时候为0,否则为1
这三个运算符还有左移右移运算符在平时的题目中运用较多,一般用来优化程序,起标记、记录的作用,比如说用二进制优化多重背包,状态压缩等等。异或也可以实现两个数的交换,会比其他的交换方法的效率更高,下面可以看一下代码:
#include <stdio.h>
int main()
{
int x,y;
x = 4; // 0100
y = 6; // 0110
x = x ^ y;
// x == 0100 ^ 0110 == 0010
y = x ^ y;
// y == 0010 ^ 0110 == 0100
x = x ^ y;
// x == 0010 ^ 0100 == 0110
printf("%d %d\n",x,y); // Output:6 4
return 0;
}
接下来是左移和右移运算符,对于左移来说就是讲二进制数整体向左移动n位,右边用0来补位。同理,右移就是整体向右移动n位,高位补0,左端被移出去的位舍掉。
左移n位实质就是将这个数乘以2的n次方。同理,右移n位就是将这个数除以2的n次方。实现过程可以通过计算得出比如0000 0110左移一位后变成0000 1100,前者的值比后者少了一个2倍,这个不难观察出。
然后是按位取反,对于一个二进制数中它的操作就是将0变为1,将1变为0
首先一个数的二进制数叫做原码,而对原码进行取反操作后得到的叫做反码。其实这个按位取反多用于求负数的二进制数,比如要求-6的二进制数,首先我们要求出6的二进制数,0000 0110,然后对其进行按位取反得到1111 1001,然后再对这个反码+1,得到1111 1010(这个叫补码),也就说反码+1就是补码。最后求得的1111 1010就是-6的二进制。对于一个二进制数来求它的十进制数的时候,首先我们要知道所求的数是有符号还是无符号的,对于有符号的来说,最高位如果是1的话,那么这个数就表示一个负数,然后按照刚才所说的倒着去推就好了。