7.20.05 位运算符

位运算符

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

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

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

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

  
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
>>> 无符号右移
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 &#124 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位
         00000000-00000000-00010100-01001101
     &   00000000-00000000-00000000-00001111
     ------------------------------------------
         00000000-00000000-00000000-00001101
    

无符号右移与右移的区别

进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补, 如果操作数是一个负数,那么左边的空缺位使用1补。而使用无符号右移的时候,不管是正数还是负数都 统一使用0补。

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
    }
}

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);
}

 

posted @ 2017-08-24 13:26  ~~晴天~^.^  阅读(197)  评论(0编辑  收藏  举报