作为杭州JAVAEE19期的一个萌新我来给班主任——婧芸小姐姐交作业辣。上了几天基础课,内容还是比较简单易懂的,技术贴好像没法写没办法,我只有写点这几天基础课上某些知识点的拓展知识咯(童鞋们,仅供了解就好。大神的话就无视此贴吧)。接下来是正题:
位运算符 课堂上学过的运算符有:算数运算符,逻辑运算符,比较运算符,三元运算符,赋值运算符……这些,常见且实用的运算符。 那么啥是位运算符呢?先来看一下,见图(假设整数变量 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); }
|