Java中的位运算符全解

目录
  • 1.&(按位与运算符)
  • 2.|(按位或运算符)
  • 3.^(异或运算符)
  • 4.<<(左移运算符)
  • 5.>>(右移移运算符)
  • 6.~(取反运算符)
  • 7.>>>(无符号右移运算符)
    • (1)正数无符号右移
    • (2)负数无符号右移
  • 总结

1. &(按位与运算符)

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

public class Main {
    public static void main(String[] args) {
        // &按位与,运算符两边的条件值会先转换为2进制,然后再比对运算
        /**
         *   0 0 1 1
         *   0 1 0 1
         *  -----------
         *   0 0 0 1
         */
        int a = 3&5;
        /**
         *   0 0 0 1
         *   0 0 1 0
         *  -----------
         *   0 0 0 0
         */
        int b = 1&2;
        System.out.println(a);// 1
        System.out.println(b);// 0
    }
}

2. |(按位或运算符)

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

public class Main {
    public static void main(String[] args) {
        // |按位或,运算符两边的条件值会先转换为2进制,然后再比对运算
        /**
         *   0 0 1 1
         *   0 1 0 1
         *  -------------
         *   0 1 1 1
         */
        int a = 3|5;
        /**
         *   0 0 0 1
         *   0 0 1 0
         *  -------------
         *   0 0 1 1
         */
        int b = 1|2;
        System.out.println(a);// 7
        System.out.println(b);// 3
    }
}

3. ^(异或运算符)

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

public class Main {
    public static void main(String[] args) {
        /**
         *   0 0 1 1
         *   0 1 0 1
         *  -------------
         *   0 1 1 0
         */
        int a = 3^5;
        /**
         *   0 0 0 1
         *   0 0 1 0
         *  -------------
         *   0 0 1 1
         */
        int b = 1^2;
        System.out.println(a);// 6
        System.out.println(b);// 3
    }
}

4. <<(左移运算符)

5<<2的意思为5的二进制位往左挪两位,右边补0

5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等于乘于2的n次方,十进制位是5*2^2=20

public class Main {
    public static void main(String[] args) {
        /**
         * 5<<2的意思为5的二进制位往左挪两位,右边补0
         *  0 0 0 0 0 1 0 1
         *  0 0 0 1 0 1 0 0
         */
        System.out.println(5<<2); // 20
    }
}

5. >> (右移移运算符)

凡位运算符都是把值先转换成二进制再进行后续的处理

5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1

public class Main {
    public static void main(String[] args) {
        /**
         * 5>>2的意思为5的二进制位往右挪两位,左边补0
         *  0 0 0 0 0 1 0 1
         *  0 0 0 0 0 0 0 1
         */
        System.out.println(5<<2); // 1
    }
}

6. ~(取反运算符)

取反就是1为0,0为1

5的二进制位是0000 0101,取反后为1111 1010,值为-6

public class Main {
    public static void main(String[] args) {
        /**
         *     0 0 0 0 0 1 0 1
         *   ---------------------
         *     1 1 1 1 1 0 1 0
         *
         *  1、如果 11111010 想转为负的十进制,因为最高位是1,所以先将11111001减1得到11111001
         *  2、取反 00010101,然后计算出 00000100 对应的十进制为6
         *  3、所以 11111010 最终对应的十进制为 -6
         *
         *     1 1 1 1 1 0 1 0
         *   - 0 0 0 0 0 0 0 1
         *   ---------------------
         *     1 1 1 1 1 0 0 1
         *   ---------------------
         *     0 0 0 0 0 1 0 0
         */
        System.out.println(~5); // -6
    }
}

7. >>>(无符号右移运算符)

(1) 正数无符号右移

无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。

15的二进制位是0000 1111 , 右移2位0000 0011,结果为3

public class Main {
    public static void main(String[] args) {
        /**
         *     0000 1111
         *   ---------------
         *     0000 0011
         */
        System.out.println(15>>>2); // 3
    }
}

(2) 负数无符号右移

-6的二进制是6的二进制取反再加1,6的二进制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1为1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111

public class Main {
    public static void main(String[] args) {
        System.out.println(-6>>>3); // 536870911
    }
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 一定要让你搞懂Java位运算符

    目录 常用的运算符 位运算符 &.|.^ 运算符 ~ 运算符 << 和 >> 运算符 >>> 运算符 有<<<运算符吗 总结 常用的运算符 在Java语言中,官方给我们提供了极为丰富的运算操作,但是常用的,好像也就是算术运算符,例如加.减.乘.除.取余等.还有就是关系运算符大于.小于.等于.不等于等.再或者就是逻辑运算符&&.||.!等,至于位运算符,属实用的不多.用的不多今天为什么拿出来讲呢,首先这可以帮助你很好的去理解

  • java基础javeSE程序逻辑控制语法

    目录 顺序结构 分支结构 if 语句 悬垂 else switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出方式 输出到控制台 从键盘输入 猜数字游戏 顺序结构 按照代码书写的顺序一行一行执行 分支结构 if 语句 基本语法形式: if(布尔表达式){ //条件满足时执行代码 } if(布尔表达式){ //条件满足时执行代码 }else{ //条件不满足时执行代码 } //多分支 if(布尔表达式){ //条件满足时执行代码 }else if(布尔表达式)

  • Java中的运算符你知道多少

    目录 1.算术运算符 1.基本的算数运算符:+-*/% 2.增量运算符**+=-=/= =%=* 3.自增自减运算符++–-- 2.关系运算符 3.逻辑运算符 4.位运算符 5.条件运算符 6.运算符的优先级 总结 1.算术运算符 1.基本的算数运算符:+ - * / % 规则比较简单,但是需要注意的是除法:a). int / int结果还是int,需要使用double来计算. int a = 1; int b = 2; System.out.println(a/b);//结果为0 b). 0不

  • Java的运算符和程序逻辑控制你了解吗

    目录 运算符 算术运算符 基本四则运算符(+-*/%) 增量运算符(+=-=*=/=%=) 自增/自减运算符(++--) 关系运算符 逻辑运算符 逻辑与(&&) 逻辑或(||) 逻辑非(!) 位运算符 按位与(&) 按位或(|) 按位取反(~) 按位异或(^) 移位运算 左移(<<) 右移(>>) 无符号右移(>>>) 小结 条件运算符 程序逻辑控制 Java中程序的逻辑控制语句 分支语句 循环结构 Java中的输入输出方式 输出到控制台

  • Java中的位运算符全解

    目录 1.&(按位与运算符) 2.|(按位或运算符) 3.^(异或运算符) 4.<<(左移运算符) 5.>>(右移移运算符) 6.~(取反运算符) 7.>>>(无符号右移运算符) (1)正数无符号右移 (2)负数无符号右移 总结 1. &(按位与运算符) &按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真):1&1=1 , 1&0=0 , 0&1=0 , 0&0=0 pu

  • Java 中的位运算与移位运算详解

    目录 位运算 按位"与" & 按位"或" | 异或 ^ 移位运算 左移 << 右移 >> 无符号右移 >>> 总结 位运算 按位"与" & 规则: 如果两个相应的二进制形式的对应的位数都为 1,则结果为 1:否则为 0: 4 & 5 4 0000 0100 5 0000 0101 按位与运算 & 4 & 5 = 4 0000 0100 1 * 2^2 = 4 -4

  • Java中BigDecimal的基本运算(详解)

    BigDecimal一共有4个够造方法,让来看看其中比较常用的两种用法: 第一种:BigDecimal(double val) Translates a double into a BigDecimal. 第二种:BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal. 使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为Str

  • 浅谈JAVA中输入输出流实例详解

    java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家介绍JAVA中输入输出流实例详解. 流的层次结构 定义:        java将读取数据对象成为输入流,能向其写入的对象叫输出流.结构图如下: 1.输入输出: 输入/输出(Input/Output)是指对某

  • java 中的instanceof用法详解及instanceof是什么意思(推荐)

    好,应大家的要求先给大家说下在JAVA程序中instanceof是什么意思 instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据. instanceof运算符用法 运算符是双目运算符,左面的操作元是一个对象实例,右面是一个类.当左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false 说明: (1).一个类的实例包括本

  • Java中的关键字synchronized 详解

    在并发编程中,synchronized关键字是常出现的角色.之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁.轻量锁.本篇介绍synchronized关键字的使用方式,区别和偏向锁.轻量锁和重量锁实现原理. 先看看synchronized关键字的4种用法. 1.修饰普通方法 private synchronized void synMethod(){ } 这种用法中,synchronized锁的对象实例. 2.修饰静态方

  • Java中synchronized实现原理详解

    记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字"同步",也成为了我们解决多线程情况的百试不爽的良药.但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它. 诚然,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么

  • HashMap源码中的位运算符&详解

    引言 最近在读HashMap源码的时候,发现在很多运算符替代常规运算符的现象.比如说用hash & (table.length-1) 来替代取模运算hash&(table.length):用if((e.hash & oldCap) == 0)判断扩容后元素的位置等等. 1.取模运算符%底层原理 ​总所周知,位运算&直接对二进制进行运算:而对于取模运算符%:a % b 相当于 a - a / b * b,底层实际上是除法器,究其根源也是由底层的减法和加法共同完成.所以其运行效

  • Java基础之位运算知识总结

    一.位运算的分类与展现效果 java位运算可以分为左移和右移,其中右移还有无符号右移.   java只对整型位移,可以分为int体系和long体系.int体系包括(byte, short, int, char),long体系只包含long.int体系中进行位运算时,除int类型外都会先转换为int再进行运算.. 无符号右移指的是,向右移动时,左边补位的是0. 一般来说,右移左移常用作乘2n 或者除以2n.(右移除以2n,左移乘以2n) int i1 = 4; int r1 = i1 >> 2;

  • Python-OpenCV教程之图像的位运算详解

    1.按位取反bitwise_not() 按位取反就是将数值根据每个bit位1变0,0变1,比如0xf0按位取反就变成了0x0f,如果是uint8类型的数据,取反前后的数据相加结果为0xff(255).下面的例子将lena.jpg和opencv-logo.png分别按位取反: import cv2 print('cv2.__version__:',cv2.__version__) img1 = cv2.imread('..\\lena.jpg') img2 = cv2.imread('..\\op

随机推荐