位运算符
课堂上学过的运算符有:算数运算符,逻辑运算符,比较运算符,三元运算符,赋值运算符……这些,常见且实用的运算符。
那么啥是位运算符呢?先来看一下,见图(假设整数变量 int A=60和变量int B=13)
其实,计算机内部呢是不会做加/减法等四则运算,和一些高级运算的(惊不惊喜,意不意外)因为计算机只认识二进制的数。而位运算符是专门对二进制操作的一类运算。
表中例一:A=60转换成二进制[11 1100],B=13转换成二进制[1101]
0000 0000 0000 0000 0000 0000 0011 1100 ——>60
& 0000 0000 0000 0000 0000 0000 0000 1101 ——>13
----------------------
0000 0000 0000 0000 0000 0000 0000 1100 ——>12 是这样得到结果的。注意:最高位表示符号位,这个在《班主任交代,一定要写两篇帖子之其一》中有说。
【 |, ~, ^,】这个3个运算符也是类似,将值转换成二进制后按照表中描述,进行操作即可。
<<左移运算符,表中例子:A<<2
0000 0000 0000 0000 0000 0000 0011 1100 ——>60
<< 0000 0000 0000 0000 0000 0000 0011 110000 ——>240 蓝色的0被干掉,红色的0补上,这就是左移运算符。结果是这样的来的
类似的,右移运算符 也是这么操作数值的。当值是负数时,位移操作要操作其值的二进制补码,然后通过补码逆向得到原码(具体什么是原码、反码、补码 参见《班主任交代,一定要写两篇帖子之其一》)。
举例说明:-4>>2
1000 0000 0000 0000 0000 0000 0000 0100(-4原码)
1111 1111 1111 1111 1111 1111 1111 1011 (反码)
1111 1111 1111 1111 1111 1111 1111 1100(补码,反码+1得到)
1111 1111 1111 1111 1111 1111 1111 1111 (右移2位,高位补1,结果的补码)
1000 0000 0000 0000 0000 0000 0000 0001(结果原码,将结果补码(非符号位)取反后+1,转换成十进制值“-1”)
而>>>被称为无符号右移,则是在补位时始终用0补齐。
举例说明:-4>>>2
1000 0000 0000 0000 0000 0000 0000 0100(-4原码)
1111 1111 1111 1111 1111 1111 1111 1011 (反码)
1111 1111 1111 1111 1111 1111 1111 1100(补码,反码+1得到)
0011 1111 1111 1111 1111 1111 1111 1111 (右移2位,高位补0,结果的补码)
0011 1111 1111 1111 1111 1111 1111 1111 (结果原码,因为最高符号位变为0,即这是一个正数的补码,正数的原、反、补都相同,
转换成十进制值是“1073741823”)
怎么样,童鞋们是不是觉得很神奇,很有趣呢
烧脑拓展:下面是一个用位运算和递归实现的加法运行(有兴趣的童鞋可以自己研究)
int add(int num1, int num2){
if(num2 == 0){
return num1;
}
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
return add(sum, carry);
}
1.jpg (172.99 KB, 下载次数: 20)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |