位运算符
位运算符就是直接操作二进制位的。
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。
假设a = 60,b = 13;它们的二进制格式表示将如下:
位运算符 | 木奥数 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
>>> | 无符号右移 |
1 | A = 0011 1100 |
下表列出了位运算符的基本运算,假设整数变量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。 应用:对数据加密.
位运算符可能会出现的笔试题目:
- 交换两个变量的值,不准出现第三方变量。
- 取出一个二进制数据的指定位数。要求读取该二进制数据的低4位
1
2
3
400000000-00000000-00010100-01001101
& 00000000-00000000-00000000-00001111
------------------------------------------
00000000-00000000-00000000-00001101无符号右移与右移的区别
进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补, 如果操作数是一个负数,那么左边的空缺位使用1补。而使用无符号右移的时候,不管是正数还是负数都 统一使用0补。1
2
3
4
5
6
7
8
9class 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
20class 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);
}
}