A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

      作为杭州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);

}



1.jpg (172.99 KB, 下载次数: 1)

1.jpg

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马