//位运算
/*
按位与& : 两位全为1,结果为1,否则为0
按位或| : 两位中有一位为1,结果为1,否则为0
按位异或^ : 两位一个为0,一个为1,结果为1,否则为0
按位取反~ : 0-》1,1-》0
算术右移>> : 低位溢出,符号位不变,并用符号位补溢出的高位
算术左移<< : 符号位不变,低位补0
>>>逻辑右移也叫无符号右移,运算规则:低位溢出,高位补0
特别说明:没有<<<符号
*/
/*
1、二进制的最高位是符号位:0表示正数,1表示负数(0->1->0 1->1)
2、正数的原码、反码、补码都是一样的(三码合一)
3、负数的反码=它的原码符号位不变,其他位取反(0->1,1->0)
4、负数的补码= 它的反码+1,负数的反码=负数的补码-1
5、0的反码,补码都是0
6、java没有符号数,换言之,java中的数都是有符号的
7、在计算机运算时,都是以补码的方式来运算的
8、当我们看运算结果时,要看它的原码(重点)
*/
public class TernaryOpertorDetail {
public static void main (String[] args){
//推导
//1.先得到2的原码 => 00000000 00000000 00000000 00000010
// 2的补码=> 00000000 00000000 00000000 00000010
//2. 3的补码=> 3的原码 00000000 00000000 00000000 00000011
// 3的补码 00000000 00000000 00000000 00000011
//3.按位&
//2的补码 00000000 00000000 00000000 00000010
//3的补码 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 00000010 & 运算后的补码
// 运算之后的原码也是 00000000 00000000 00000000 00000010
// 结果就是(转换为十进制) 2
System.out.println(2&3);//2
//推导
//1.先得到-2的补码 =》-2的反码=》-2的原码
// -2的原码 10000000 00000000 00000000 00000010
// 负数的反码=它的原码符号位(即左边开头第一个符号位,正数原码符号位为0,负数原码符号位为1)不变,其他位取反(0->1,1->0)
// -2的反码 11111111 11111111 11111111 11111101
// 负数的补码= 它的反码+1,负数的反码=负数的补码-1
// -2的补码 11111111 11111111 11111111 11111110
//2.~-2的操作 00000000 00000000 00000000 00000001 ~ 运算后的补码
// 运算后的原码就是00000000 00000000 00000000 00000001=》 1
System.out.println(~-2);//1
//推导
//1.在计算机运算时,都是以补码的方式来运算的
// 先得到2的补码=》2的原码 正数的原码、反码、补码都是一样的(三码合一)
// 2的原码 => 00000000 00000000 00000000 00000010
// 2的补码=> 00000000 00000000 00000000 00000010
// ~2的操作=>11111111 11111111 11111111 11111101 ~运算后的补码
//负数的补码= 它的反码+1,负数的反码=负数的补码-1
//运算后的反码11111111 11111111 11111111 11111100
//负数的反码=它的原码符号位不变,其他位取反(0->1,1->0)
//运算后的原码10000000 00000000 00000000 00000011 即结果为-3
System.out.println(~2);//-3
//int a = 1>>2 =》00000000 00000000 00000000 00000001 -》00000000 00000000 00000000 00000000本质1/2/2=0
System.out.println(1>>2);//0
//int c = 1 <<2 =》00000000 00000000 00000000 00000001 -》00000000 00000000 00000000 00000100本质1*2*2=4
System.out.println(1<<2);//4
}
}
java 位运算
于 2023-03-07 11:53:05 首次发布