以一个字节 8位做演算
a的2进制 00011100
b的2进制:00110111
int a = 28; int b = 55;a: 00011100
b: 00110111
一、按位与(&)运算 全1为1 见0为0
a: 00011100
b: 00110111
a&b: 00010100
二、按位或(|)运算 见1为1 全0为0
a: 00011100
b: 00110111
a|b: 00111111
三、异或(^) 不同为0 相同为1
a: 00011100
b: 00110111
a^b: 00101011
四、左移(<<)
左移 n 位
二进制左移 n位
相当于10进制乘2的n次方
a: 00011100
b: 00110111
a<<3: 11100000
10进制值:224 扩大 8倍
五、右移(>>)
右移 n 位
二进制右 n位
相当于10进制除2的n次方(每次除了之后若有小数都是取整数部分)
a: 00011100
b: 00110111
a>>3: 00000011
//十进制得法
28/2 = 14
14/2 = 7
7/2 = 3.5 但由于java整数类型 所以 7/2实际上 = 3 所以
10进制值:3 缩小 8倍
六、按位取反(~)
a: 00011100
~a: 11100011
七、上java代码
package groundFloor;
/** 按位与运算、或运算、异或运算、转32位
* @author codelmh
* @data 2021/12/5
*/
public class Operation {
public static void main(String[] args) {
int a = 28;
int b = 55;
System.out.println("========原32位值==========");
print(a);
print(b);
/*
按位与运算 &
全1为1 见0为0
*/
System.out.println("========按位 与 & 后的值==========");
print( a & b);
/*
按位或运算 |
见1为1 全0为0
*/
System.out.println("========按位 与 | 后的值==========");
print( a | b);
/*
左移 n 位
二进制左移 n位
相当于10进制乘2的n次方
*/
System.out.println("========左移3位 后的值==========");
print( a << 3);
System.out.println(a << 3 );
print( b << 3);
System.out.println(b << 3);
/*
右移 n 位
二进制右 n位
>> 带符号右移
>>> 不带符号右移
*/
System.out.println("========右3位 后的值==========");
print( a >> 3);
System.out.println(a >> 3 );
print( b >> 3);
System.out.println(b >> 3 );
/*
异或运算 ^
不同为0 相同为1
*/
System.out.println("========异或^ 后的值==========");
print( a ^ b);
/*
按位取反
1位0 0为1
*/
System.out.println("========按位取反 后的值==========");
print( ~a);
}
/**
* 10进制转32位方法
* @param num 数值
*/
public static void print(Integer num){
for(int i = 31; i >= 0; i--) {
/*
( 1 << i ) 1 向左移 i 位
( num & (...) 按位 & 与运算 全1为1 见0为0
( boolean) ? "0" : "1" 三目运算
boolean = true 则 = 0 boolean = false 则 = 1
*/
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
if ( i % 8 == 0){
// 每8位 一个字节 + 空格
System.out.print(" ");
}
}
System.out.println();
}
}
若是要得到一个数的相反数我们可以
//第一种
System.out.println(-a);
//第二种
System.out.println(~a+1);