& 与运算
:两个位都是 1 时,结果才为 1,否则为 0| 或运算
:两个位都是 0 时,结果才为 0,否则为 1^ 异或运算
:两个位相同则为 0,不同则为 1~ 取反运算
:0 则变为 1,1 则变为 0<< 左移运算
:向左进行移位操作,高位丢弃,低位补 0>> 右移运算
:向右进行移位操作,对无符号数,高位补 0,对有符号数,高位补符号位。- 应用:
(1)异或 ^,两个相同的数异或之后的结果是 0,即 n ^ n = 0;并且任何数与 0 异或等于它本身,即 n ^ 0 = n。
(2)n & (n - 1) 这个操作的作用是消除数字 n 的二进制表示中的最后一个 1,即将最后一个 1 变为 0。
// 判断奇偶
if((n & 1) == 1){ // 必须加括号,因为 == 的优先级比 & 高
// 奇数
}
if((n & 1) == 0){ // 必须加括号,因为 == 的优先级比 & 高
// 偶数
}
// 位操作实现乘除法
int a = 4;
a << 1; // 8
a >> 1; // 2
// 求相反数
a = ~a + 1;
// 判断两个数是否异号
int x = -1, y = 2;
boolean f = (x ^ y) < 0; // true
int x = 3, y = 2;
f = (x ^ y) < 0; // false
// 不用临时变量交换两个数
int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
// 求绝对值
int abs(int a){
int i = a >> 31; // 判断符号位。正数右移 31 位得 0,负数右移 31 位得 -1
return i == 0 ? a : (~a + 1);
}
// 将英文字符转换为小写
char c1 = 'a' | ' '; // char c1 = 97; 即 a
char c2 = 'A' | ' '; // char c2 = 97; 即 a
// 将英文字符转换为大写
char c3 = 'b' & '_'; // char c3 = 66; 即 B
char c4 = 'B' & '_'; // char c4 = 66; 即 B
// 英文字符大小写互换
char c5 = 'c' ^ ' '; // char c5 = 67; 即 C
char c6 = 'C' ^ ' '; // char c6 = 99; 即 c