• Java二进制位运算符


    1.简述

      看这篇文章之前首先了解一下原码,反码,补码的概念。https://www.cnblogs.com/bl123/p/13730998.html

      需要注意的是,二进制都是从高位到低位。

    2.位运算符分类

    符号 描述 运算规则
    & 按位与,如果对应的二进制位同时为 1,那么计算结果才为 1;否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。
    | 按位或,如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。
    ^ 异或 按位异或,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。
    ~ 取反 按位取反,只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。
    >> 右移 有符号按位右移,只对一个操作数进行运算,将操作数二进制形式向右移动对应的位数,低位移出(舍弃),高位的空位补零。
    << 左移 按位左移,只对一个操作数进行运算,将操作数二进制形式向左移动对应的位数,高位移出(舍弃),低位的空位补零。
    >>> 无符号右移 无符号按位右移,只对一个操作数进行运算,将操作数按二进制形式忽略符号位的右移,空位都以0补齐。

    3.分类中各种位运算符简述

    (1)&(与运算)

      参加运算的两个数据,按二进制位进行“与”运算。

      运算规则:0 & 0 = 0、0 & 1 = 0、1 & 0 = 0、1 & 1 = 1。:两位同时为1,结果才为1,否则为0。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(3));
            System.out.println(binaryToDecimal(5));
            System.out.println(binaryToDecimal(3 & 5));
            System.out.println(3 & 5);
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 16 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    0000 0000 0000 0011

    0000 0000 0000 0101

    0000 0000 0000 0001

    1

      根据示例的输出结果我们可以得出,3 & 5即0000 0000 0000 0011 & 0000 0000 0000 0101 = 0000 0000 0000 0001因此,3 & 5的值等于1。

    (2)|(或运算)

      参与运算的两个数据,按照二进制位进行“或”运算。

      运算规则:0 & 0 = 0、0 & 1 = 1、1 & 0 = 1、1 & 1 = 1。:参与运算的两个数据只要有一个值为1 那么值为1。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(3));
            System.out.println(binaryToDecimal(5));
            System.out.println(binaryToDecimal(3 | 5));
            System.out.println(3 | 5);
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 16 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    0000 0000 0000 0011

    0000 0000 0000 0101

    0000 0000 0000 0111

    7

      根据示例的输出结果我们可以得出,3 | 5即0000 0000 0000 0011 | 0000 0000 0000 0101 = 0000 0000 0000 0111因此,3 | 5的值等于7。

    (3)^(异或运算)

      参与运算的两个数据,按照二进制位进行“异或”运算。

      运算规则:0 & 0 = 0、0 & 1 = 1、1 & 0 = 1、1 & 1 = 0。:参加运算的两个对象,如果两个相应位值不同,则该位结果为1,否则为0。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(3));
            System.out.println(binaryToDecimal(5));
            System.out.println(binaryToDecimal(3 ^ 5));
            System.out.println(3 ^ 5);
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 16 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    0000 0000 0000 0011

    0000 0000 0000 0101

    0000 0000 0000 0110

    6

      根据示例的输出结果我们可以得出,3 ^ 5即0000 0000 0000 0011 ^ 0000 0000 0000 0101 = 0000 0000 0000 0110因此,3 ^ 5的值等于6。

    (4)~(取反运算)

      参与取反的一个数据,按照二进制位进行“取反”运算。

      取反规则:1 = 0、0 = 1。:参加取反的一个对象,如果相应位值为0,则该位结果为1,否则为0。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(3));
            System.out.println(binaryToDecimal(~3));
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 32 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length + 3; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    0000 0000 0000 0000 0000 0000 0000 0011

    1111 1111 1111 1111 1111 1111 1111 1100

      根据示例的输出结果我们可以得出,~3即0000 0000 0000 0000 0000 0000 0000 0011 = 1111 1111 1111 1111 1111 1111 1111 1100。

    (5)>>(右移运算)

      参与右移的一个数据,按照二进制位进行“右移”运算。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(-256));
            System.out.println(binaryToDecimal(-256 >> 4));
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 16 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length + 3; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    1111 1111 1111 1111 1111 1111 0000 0000

    1111 1111 1111 1111 1111 1111 1111 0000

      根据示例的输出结果我们可以看到,二进制数向右边移动了4位,因为是有符号的右移,所以如果是负数的话,那就会补充1,正数则补充0。

    (6)<<(左移运算)

      参与左移的一个数据,按照二进制位进行“左移”运算。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(-256));
            System.out.println(binaryToDecimal(-256 << 4));
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 32 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length + 3; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    1111 1111 1111 1111 1111 1111 0000 0000

    1111 1111 1111 1111 1111 0000 0000 0000

      根据示例的输出结果我们可以看到,二进制数向左边移动了4位,空位补充0。

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

      参与无符号右移的一个数据,按照二进制位进行“无符号右移”运算。

      示例如下

    public class Test{
        public static void main(String[] args) {
            System.out.println(binaryToDecimal(-256));
            System.out.println(binaryToDecimal(-256 >>> 4));
        }
        
        /**将10进制转为2进制字符串
         */
        private static String binaryToDecimal(int num) {
            StringBuilder sb = new StringBuilder();
            sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制
            int length = sb.length();
            for (int i = 0; i < 32 - length; i++) {//补齐16位
                sb.insert(0, 0);
            }
            length = sb.length();
            for (int i = 0; i < length + 3; i++) {
                if((i + 1) % 5 == 0)
                    sb.insert(i, " ");
            }
            return sb.toString();
        }
    }
    View Code

    运行结果

    1111 1111 1111 1111 1111 1111 0000 0000

    0000 1111 1111 1111 1111 1111 1111 0000

      根据示例的输出结果我们可以看到,二进制数向右边移动了4位,因为是无符号右移所以空位直接补充0。

  • 相关阅读:
    《Apache Doris在美团外卖数仓中的应用实践》
    《一文教会你如何写复杂业务的代码》
    《SOFA企业应用框架》
    《为什么阿里巴巴代码规约要求避免使用 Apache BeanUtils 进行属性的拷贝》
    《浅析VO、DTO、DO、PO的概念、区别和用处》
    Spring 注解
    《浅析VO、DTO、DO、PO的概念、区别和用处》
    dsgn_ebook
    《清华大学刘世霞“可解释机器学习的可视化分析”(附PPT)》
    《图结构的相似度度量与分类》
  • 原文地址:https://www.cnblogs.com/bl123/p/13734880.html
Copyright © 2020-2023  润新知