以两个int型数据为例子,详细的描述它们之间进行& | ^操作的底层二进制运算过程,并分别对它们进行取反操作。
/**
两个int型数据进行& | ^操作,并对它们进行~
底层二进制运算过程
取反:取反操作后,若为正数,变为负数,且数值比原来大1
若为负数,变为正数,且数值比原来小1
*/
public class BinaryTest {
public static void main(String[] args) {
//若为正数,前边的0可以省略,若为负数,不能省略 int 4字节
int a = 0xA9; //0000 0000 0000 0000 0000 0000 1010 1001 ->169
int b = 0xC7; //0000 0000 0000 0000 0000 0000 1100 0111 ->199
/*
0000 0000 0000 0000 0000 0000 1010 1001 a
& (有0为0,与操作只有全为1才能得1)
0000 0000 0000 0000 0000 0000 1100 0111 b
0000 0000 0000 0000 0000 0000 1000 0001 ->0x81->129
*/
System.out.println(a & b);
/*
0000 0000 0000 0000 0000 0000 1010 1001 a
| (有1为1,或操作只要有一个是1就得1)
0000 0000 0000 0000 0000 0000 1100 0111 b
0000 0000 0000 0000 0000 0000 1110 1111 ->0xEF->239
*/
System.out.println(a | b);
/*
0000 0000 0000 0000 0000 0000 1010 1001 a
^ (异或操作,只有不同时才得1,相同得0)
0000 0000 0000 0000 0000 0000 1100 0111 b
0000 0000 0000 0000 0000 0000 0110 1110 ->0x6E->110
*/
System.out.println(a ^ b);
/*
0000 0000 0000 0000 0000 0000 1010 1001 a
~ (按位取反,包括符号位)
1111 1111 1111 1111 1111 1111 0101 0110 ->
求值过程(底层保存为补码,负数求原码 先减一 --> 除符号位按位取反)
减一1111 1111 1111 1111 1111 1111 0101 0101 ->
取反1000 0000 0000 0000 0000 0000 1010 1010 ->0x8000 00AA->-170 (除符号位进行取反)
*/
System.out.println(~ a);
/*
0000 0000 0000 0000 0000 0000 1100 0111 b
~
1111 1111 1111 1111 1111 1111 0011 1000 ->
求值过程(底层保存为补码,负数求原码 先减一 --> 除符号位按位取反)
减一1111 1111 1111 1111 1111 1111 0011 0111 ->
取反1000 0000 0000 0000 0000 0000 1100 1000 ->0x8000 00C8->-200
*/
System.out.println(~ b);
/*
原码1000 0000 0000 0000 0000 0000 0000 0110
补码1111 1111 1111 1111 1111 1111 1111 1010
~
0000 0000 0000 0000 0000 0000 0000 0101
*/
System.out.println(~ (-6)); // 5 若为负数,变为正数,且数值比原来小1
}
}