Java运算符&,&&,|,||,^,<<,>>,~,>>>

硅谷探秘者 1029 0 0

1. &(按位与[位运算]

         /***
          * 结果:2
          */
         @Test
         public void test1() {
                   int a=6;
                   int b=3;
                   System.out.println(a&b);
         }

&按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0

6的二进制00000110,3的二进制是00000011那么由按位与运算规则得知6&3=00000110&00000011=00000010即为十进制的2


2. &&(逻辑与)

/***
          * 结果:false
          */
         @Test
         public void test2() {
                   System.out.println(1==1&&1==2);
         }

&&逻辑与也称为短路逻辑与,先运算&&左边的表达式,一旦为假,后续不管多少表达式,均不再计算,一个为真,再计算右边的表达式,两个为真才为真。


3. |(按位或[位运算])

         /***
          * 结果:7
          */
         @Test
         public void test3() {
                   int a=6;
                   int b=3;
                   System.out.println(a|b);
         }

|按位或和&按位与计算方式都是转换二进制再计算,不同的是运算规则(一个为真即为真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1

6的二进制00000110,3的二进制是00000011那么由按位与运算规则得知6|3=00000110|00000011=00000111即为十进制7


4. ||(逻辑或)

/***
          * 结果:true
          */
         @Test
         public void test4() {
                   System.out.println(1==1||1==2);
         }

逻辑或||的运算规则是一个为真即为真,后续不再计算,一个为假再计算右边的表达式。


5. ^(异或运算符[位运算])

         /***
          * 结果:5
          */
         @Test
         public void test5() {
                   int a=6;
                   int b=3;
                   System.out.println(a^b);
         }

^异或运算符顾名思义,异就是不同,其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0

6的二进制00000110,3的二进制是00000011那么由按位与运算规则得知6^3=00000110^00000011=00000101即为十进制5


6. <<(左移运算符[位运算])

         /***
          * 结果:24
          */
         @Test
         public void test6() {
                   int a=6;
                   System.out.println(a<<2);
         }

6<<2的意思为6的二进制位往左挪两位,右边补0,6的二进制位是0000 0110 , 就是把有效值110往左挪两位就是0001 1000 即为10进制24,正数左边第一位补0,负数补1,等于乘于2的n次方。


7.>>(右移运算符[位运算])

         /***
          * 结果:1
          */
         @Test
         public void test7() {
                   int a=6;
                   System.out.println(a>>2);
         }

6>>2的意思为6的二进制位往右挪两位, 6的二进制位是0000 0110 , 就是把有效值110往右挪两位就是00000001 即为10进制1,正数左边第一位补0,负数补1,等于除于2的n次方


8.~(取反运算符[位运算])

         /***
          * 结果:-7
          */
         @Test
         public void test8() {
                   int a=6;
                   System.out.println(~a);
         }

取反就是1为0,0为1。

~6就是把二进制的各位取反,0变成1,1变成0。6的二进制数为00000000 00000000 00000000 0000 0110,按位取反以后是11111111 11111111 11111111 11111001,11111111 11111111 11111111 11111001在计算机中是用补码表示的,其成真值为10000000 00000000 00000000 00000111。十进制为-7。

已知补码求真值:

http://www.jiajiajia.club/blog/artical/176



9.>>>(无符号右移运算符[位运算])

         /***
          * 结果:1073741822
          */
         @Test
         public void test9() {
                   int a=-6;
                   System.out.println(a>>>2);
         }

-6的二进制在计算机中的表示为11111111 11111111 11111111 11111010。无符号右移两位变为00111111 11111111 11111111 11111110。右移以后在计算机中表示的数变成了正数,所以真值也为00111111 11111111 11111111 11111110十进制就是1073741822


d.png




评论区
请写下您的评论...
暂无评论...
猜你喜欢
blog java笔记
其他 2036 java笔记以下笔记皆为抄录,来源于《疯狂java讲义》1.1位 &按位与。当两位同时为1时才返回1 |按位或。只要有一位为1即可返回1 ~按位非。单目,将操作数的每个位(包括
java springboot 1726 涉及知识点:java动态编译,java反射,io流,java文件操作,输入输出重定向,多线程与线程安全,mysql数据库设计等,理解起来难度较高。下面是我自己设计的几个问题,和一些测试数据。排序问题
official 748 《计机组成原理》器的基本组成如下器的基本组成控制器的基本组成控制器的基本组成完成一条指令的步骤完成一条指令的步骤计机的工作过程过程描述起来非常复杂,不太好描述,我也是截图贴在了这里(原视
数据结构与算法 3036 后续表达式计器核心法:1.前缀表达式转后缀表达式-开始扫描:2·元素为数字时,加入后缀表达式;3·元素为:a.若为'(',入栈;、b.若为')',则依次把栈中的的加入后缀表达式中,直
java基础 3378 在用各种框架的时候,注解是几乎都会遇到的,那么他的原理是怎么样的呢!来探究一下1.我们用过很多注解比如下面的jdk自带的注解@Override表示覆盖或重写父类的方法;@Deprecated表示该方法已经过时了。(当方法或是类上面有@Deprecated注解时,说明该方法或是类都已经过期不能再用,但不影响以前项目使用,提醒你新替代待的方法或是类。如果程序员不小心使用了它的元素,那么编译器会发出警告
java基础 1920 java正则表达式过滤去除特殊字publicstaticvoidmain(String[]args){longl=System.currentTimeMillis();StringregEx
java基础 1117 java根据多空格或tab进行字串分割publicstaticvoidmain(String[]args){Stringtext="dsdfsdddddgsdfsd";String[]split
算法基础 948 今天在项目中遇到用"|"分割字串的问题,如果直接使用下面方式,不会按照我们预想的分割:String[]ids="12|13|14".split("|");分割出来是[1,2,|,1,3,|1,4
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。