浅谈位运算

    位运算是计算机的底层运算,让计算机来还做是相当快的。

    那么随之而来的就是位运算的运算符,类似于逻辑门电路。


取反

对一个二进制数的每一位进行逻辑去反,符号为 ~。 eg. ~0111(十进制7) = 1000(十进制8)。

但是如果这样写:

printf("%d", ~7);

则会得到-8。但是并没有任何问题。因为每个整数实数变量的第一个二进制位都是用来存符号的,代表这个数的正负。而前面说到取反会对二进制数的每一位进行逻辑取反,所以符号也就反了。因此不妨在前面加一个负号。


按位或

处理两个长度相同的二进制数,若对应二进制数位上的数至少有一个1,则该位的结果为1,符号为|。eg. 0101(十进制5) | 0011(十进制3) = 0111(十进制7)。

printf("%d", 5 | 3);

 就得到了7。


按位异或

处理两个长度相同的二进制数,若对应二进制数位上的数相同,则该位的结果为0;否则为1。符号为^。eg. 0101 ^ 0011 = 0110.

printf("%d",5 ^ 3);

于是得到了6。 


按位与

处理两个相同长度的二进制数,若对应二进制数位上的数都为1,则该位的结果为1,否则为0。符号:&。eg. 0101 & 0011 = 0001.

printf("%d", 5 & 3);

输出1.


右移(<<)

将一个二进制数的右边补充0。eg. 1111 << 1 = 11110,1111 << 2 = 111100。右移n位相当于乘2的n次方。

对应的也有左移(>>)的操作,即去掉二进制数的末尾。eg. 1111 >> 1 = 111,1111 >> 2 = 11。左移n位相当于整除2的n次方。

printf("%d ", 15 << 1);
printf("%d", 15 >> 1);

将得到30 7的输出

猜你喜欢

转载自blog.csdn.net/qq_35436309/article/details/82825713