• Java中的位运算符


    在Java中存在着这样一类操作符,是针对二进制进行操作的。它们各自是&、|、^、~、>>、<<、>>>几个位操作符。不管是初始值是依照何种进制,都会换算成二进制进行位

    操作。接下来对这几种操作符进行一下简单的解说。

    &:

    作用是对运算符两側以二进制表达的操作符按位分别进行'与'运算。而这一运算是以数中同样的位(bit)为单位的。操作的规则是:仅当两个操作数都为1时。输出结果才为1。否

    则为0,示比例如以下:

           12 的二进制为 1100

    5   的二进制为 0101

    则 12 & 5 的二进制为 0100,则完整的运算式为 12 & 5 = 4; 

    |:

    作用是对运算符两側以二进制表达的操作符按位分别进行'或'运算。而这一运算是以数中同样的位(bit)为单位的。

    操作的规则是:仅当两个操作数都为0时,输出的结果才为0。

    否则为1,示比例如以下:

    12 的二进制为 1100

    5   的二进制为 0101

    则 12 | 5 的二进制为 1101。则完整的运算式为 12 & 5 = 13; 

    ^

    作用是对运算符两側以二进制表达的操作数按位分别进行'异或'运算,而这一运算是以数中同样的位(bit)为单位的。

    异或运算操作的规则是:仅当两个操作数不同一时候。对应的

    输出结果才为1,否则为0,示比例如以下:

    12 的二进制为 1100

    5   的二进制为 0101

    则 12 | 5 的二进制为 1001。则完整的运算式为 12 & 5 = 9; 

    ~

    '取反'运算符~的作用是将各位数字取反:全部的0置为1,1置为0,示比例如以下:

    12 的二进制为 1100

    进行取反操作为 10000000 00000000 00000000 00001101

    则完整的运算式为 ~12 = -13

    <<

    左移就是把一个数的全部位数都向左移动若干位,示比例如以下:

    12 的二进制为 1100

    则 12 << 1 的二进制为 11000, 则完整的运算式为 12 << 1 = 24;

    >>

    右移就是把一个数的全部位数都向右移动若干位,示比例如以下:

    12 的二进制为 1100

    则 12 >> 1 的二进制为 0110。 则完整的运算式为 12 >> 1 = 6;

    >>>

    无符号右移一位。不足的补0。 示比例如以下:

    12 的二进制为 1100

    则 12 >> >1 的二进制为 0110, 则完整的运算式为 12 >> 1 = 6;

    public static void main(String[] args) {
            int a = 12;
            int b = 5;
            
            System.out.println(Integer.toBinaryString(a));// 1100
            System.out.println(Integer.toBinaryString(b));// 0101
            
            System.out.print(a&b);// 0100
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(a&b));
            System.out.println();
            
            System.out.print(a|b);// 1101
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(a|b));
            System.out.println();
            
            System.out.print(a^b);// 1001
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(a^b));
            System.out.println();
            
            System.out.print(~a);// 
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(~a));
            System.out.println();
            
            System.out.print(a<<2);// 110000
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(a<<2));
            System.out.println();
            
            System.out.print(a>>2);// 0011
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(a>>2));
            System.out.println();
            
            System.out.print(a>>>2);// 0011
            System.out.print("  ");
            System.out.print(Integer.toBinaryString(a>>>2));
            System.out.println();
            
        }

    题外话:位运算是一种基于二进制的运算,涉及到知识包含原码、反码、补码,具体三者的关系,看这里:二进制(原码、反码、补码)

    在JDK的原码中。有很多初始值都是通过位运算计算的,位运算有很多特性,能够在线性增长的数据中起到作用。且对于一些运算,位运算是最直接、最简便的方法。

  • 相关阅读:
    hdu 1250
    hdu 4540(简单dp)
    hdu 1078+hdu1978+hdu 1428
    hdu 2208(dfs)
    hdu 3639(强连通+缩点+建反向图)+hdu 3072(最小树形图)
    hdu 1317+hdu 1535(SPFA)
    hdu 1245(最短路+bfs)
    hdu 1286( 欧拉函数 )
    Elementary Methods in Number Theory Exercise 1.4.1
    Elementary Methods in Number Theory Exercise 1.4.2
  • 原文地址:https://www.cnblogs.com/shamo89/p/9846391.html
Copyright © 2020-2023  润新知