62,615
社区成员
发帖
与我相关
我的任务
分享
public class BitOpt {
public static void main(String[] args) {
int n = -61;
int a = 61; //00000000 00000000 00000000 00111101
r = a << 6;
//00000000 00000000 00000000 00111101 : 61 a
//00 00000000 00000000 00111101 XXXXXX //左面有6位移出丢弃了,后面空缺6位补0得到
//--------------------------------------------- <<
//00000000 00000000 00001111 01000000 : 3904 r
r = n >> 3;
//11111111 11111111 11111111 11000011 : -61 n
//XXX 11111111 11111111 11111111 11000 //右面有3位(011)移出丢弃了,前面高位面空缺3位如果移位前原数最高位为1则补1否则补0得到
//--------------------------------------------- >>
//11111111 11111111 11111111 11111000 : -8 r
r = n >>> 3;
//11111111 11111111 11111111 11000011 : -61 n
//XXX 11111111 11111111 11111111 11000 //右面有3位(011)移出丢弃了,前面高位面空缺3位补0得到
//--------------------------------------------- >>>
//00011111 11111111 11111111 11111000 : 536870904 r
System.out.println(r);
}
}
public class Test {
public static void main(String[] args) {
System.out.println("123123^50 = " + (123123 ^ 50));
System.out.println(toFullBinaryString(123123));
System.out.println(toFullBinaryString(50));
System.out.println(toFullBinaryString(123123^50));
System.out.println();
System.out.println("123123>>5 = " + (123123>>5));
System.out.println(toFullBinaryString(123123));
System.out.println(toFullBinaryString(123123>>5));
}
private static String toFullBinaryString(int num) {
char[] chs = new char[Integer.SIZE];
for(int i = 0, k = chs.length; i < k; i++) {
chs[k - i - 1] = ((num >> i) & 1) == 0 ? '0' : '1';
}
return new String(chs);
}
}
public class BitOpt {
public static void main(String[] args) {
//位运算符共7个:& | ^ ~ << >> >>>
//计算规则,把二进制位1当作true,0当作false看待,按相应逻辑运算规则计算对应二进制位
//^ 按位异或规则为相同为0不同为1,即1-1和0-0得到0,1-0和0-1得到1
int r = 0;
int a = 61; //00000000 00000000 00000000 00111101
int b = -4; //11111111 11111111 11111111 11111100
r = a & b;
//00000000 00000000 00000000 00111101 : 61 a
//11111111 11111111 11111111 11111100 : -4 b
//--------------------------------------------- &
//00000000 00000000 00000000 00111100 : 60 r
r = a | b;
//00000000 00000000 00000000 00111101 : 61 a
//11111111 11111111 11111111 11111100 : -4 b
//--------------------------------------------- |
//11111111 11111111 11111111 11111101 : -3 r
r = a ^ b;
//00000000 00000000 00000000 00111101 : 61 a
//11111111 11111111 11111111 11111100 : -4 b
//--------------------------------------------- ^
//11111111 11111111 11111111 11000001 : -63 r
r = ~a;
//00000000 00000000 00000000 00111101 : 61 a
//--------------------------------------------- ~
//11111111 11111111 11111111 11000010 : -62 r
}
}
public class BitOpt {
public static void main(String[] args) {
//int 类型变量共使用4个字节即32位二进制位存储
//其中最高位第32位为符号位,表示此整数是否有负号,0代表没有即正数1代表有负号即负数
int m = 61; //111101为其二进制表示形式
//正整数的存储形式:除第32位符号位为0外,其余31位是直接把此数的二进制表示形式通过补0补齐到31位得到的如下
// 0000000 00000000 00000000 00111101
//结合符号位0最终得到61在内存中的存储形式
//00000000 00000000 00000000 00111101
int n = -61;
//负整数的存储形式:除第32位符号位为1外,其余31位的处理稍复杂一些,如下
//1. 先得到此负数的绝对值61的二进制表示形式通过补0补齐到31位得到
// 0000000 00000000 00000000 00111101
//2. 在上面的基础上按位取反,即0变1,1变0,得到
// 1111111 11111111 11111111 11000010
//3. 在步骤2的基础上按二进制计算规则(逢二进一)加上1得到
// 1111111 11111111 11111111 11000011
//结合符号位1最终得到-61在内存中的存储形式
//11111111 11111111 11111111 11000011
}
}