Java SE笔记: 位运算符

位运算符

位运算符就是直接操作二进制位的。

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

位运算符作用在所有的位上,并且按位运算。

假设a = 60,b = 13;它们的二进制格式表示将如下:

位运算符 木奥数
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
>>> 无符号右移
1
2
3
4
5
6
7
A = 0011 1100 
B = 0000 1101
-----------------
A & b = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A = 1100 0011

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符 描述 例子
按位与操作符,当且仅当两个操作数的某一位都非0时候结果的该位才为1。 (A&B),得到12,即0000 1100
| 按位或操作符,只要两个操作数的某一位有一个非0时候结果的该位就为1。 (A | B)得到61,即 0011 1101
^ 按位异或操作符,两个操作数的某一位不相同时候结果的该位就为1。 (A ^ B)得到49,即 0011 0001
按位补运算符翻转操作数的每一位。 (〜A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111

异或的应用
如果操作数A连续异或同一个操作数两次,那么结果还是操作数A。 应用:对数据加密.

位运算符可能会出现的笔试题目:

  1. 交换两个变量的值,不准出现第三方变量。
  2. 取出一个二进制数据的指定位数。要求读取该二进制数据的低4位
    1
    2
    3
    4
        00000000-00000000-00010100-01001101
    & 00000000-00000000-00000000-00001111
    ------------------------------------------
    00000000-00000000-00000000-00001101

    无符号右移与右移的区别

    进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补, 如果操作数是一个负数,那么左边的空缺位使用1补。而使用无符号右移的时候,不管是正数还是负数都 统一使用0补。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Demo
    {
    public static void main(String[] args){
    System.out.println(6&3); // 2
    System.out.println(6|3); // 7
    System.out.println(6^3); // 5
    System.out.println(~7); // -8
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class Demo 
    {
    public static void main(String[] args) {
    int a = 3;
    int b = 5;
    // 第一种方式: 定义第三方变量。
    int temp = a; //3
    a = b; //a = 5
    b = temp;
    //方式2:相加法, 缺点: 两个int类型的数据相加,有可能会出现超出int的表示范围。
    a = a+b; // a =8
    b = a-b; //b = 8 - 5 = 3
    a = a-b; // a = 8 - 3 = 5
    //方式3: 可以使用异或。 缺点: 逻辑不清晰。
    a = a^b; // a = 3^5
    b = a^b; // b = (3^5)^5 = 3
    a = a^b; // a = (5^3)^3 = 5
    System.out.println("a = "+ a+" b="+b);
    }
    }
文章目录
  1. 1. 位运算符
    1. 1.1. 位运算符可能会出现的笔试题目:
    2. 1.2. 无符号右移与右移的区别