--- title: Java SE笔记: 位运算符 date: 2016-07-20 21:50:00 updated: 2016-07-20 21:50:00 description: "位运算符" categories: [个人笔记] tags: [Java, Java SE笔记] --- ## 位运算符 位运算符就是直接操作二进制位的。 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 | 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. 交换两个变量的值,不准出现第三方变量。 1. 取出一个二进制数据的指定位数。要求读取该二进制数据的低4位 ``` 00000000-00000000-00010100-01001101 & 00000000-00000000-00000000-00001111 ------------------------------------------ 00000000-00000000-00000000-00001101 ``` ### 无符号右移与右移的区别 进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补, 如果操作数是一个负数,那么左边的空缺位使用1补。而使用无符号右移的时候,不管是正数还是负数都 统一使用0补。 ```java 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 } } ``` ```java 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); } } ```