一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
位运算符
简介
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
描述
| 操作符 | 描述 | 例子 |
|---|---|---|
| &(与) | 如果相对应位都是1,则结果为1,否则为0 | (A&B)得到12,即0000 1100 |
| |(或) | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
| ^(异或) | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
| ~(非) | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 | (〜A)得到-61,即1100 0011 |
| <<(左移) | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
| >>(右移) | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
| >>>(右移补0) | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
例子
leetcode上的136题
/*
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
不使用额外的空间
示例:
输入: [2,2,1]
输出: 1
示例:
输入: [4,1,2,1,2]
输出: 4
*/
class Solution {
public int singleNumber(int[] nums) {
int a = 0;
for (int i = 0; i < nums.length; i++) {
a = a ^ nums[i];
}
return a;
}
}
/*
分析:
由不使用额外的空间可知可以往位运算符上靠拢
nums = [2,3,2,4,4]
2 ^ 3 ^ 2 ^ 4 ^ 4等价于 2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^3 => 3
*/