public static void main(String[] args) { /** * & 与运算 * 1, 二进制都为1才为1; * */ /*System.out.println(5 & 3); // 101 & 11 = 1 --> 1 System.out.println(5 & 3); // 11 & 101 = 1 --> 1 System.out.println(-5 & 4); // 11111011 & 100 = 0 --> 0 System.out.println(-10 & 5); // 11110110 & 101 = 100 --> 4 */ /** * | 或运算 * 1, 如果相对应位都为0,则结果为0,否则为1 * 2, 只取8位进行计算, 不是32位 */ /*System.out.println(5 | 3); // 101 | 11 = 111 --> 7 System.out.println(3 | 5); // 11 | 101 = 111 --> 7 System.out.println(-5 | 3); // 11111011 | 11 = 11111111 --> -3 System.out.println(5 | -3); // 101 | 11111101 = 11111101 --> -5 */ /** * ~ 非运算, 按位取反 * 1,重点 * 2, 流程: 原码 --》 反码 --》 补码 --》补码 --》反码 --》 原码 * 2,取八位计算,int(32位): * 比如 :5 的二进制 补码是: 00000101 * 取反补码是: 11111010 * 补码转反码-1: 11111001 * 反码转原码(最高位为1,负数):10000110 * 结果: -6 * * 如果是负数:-5 * -5的补码: 11111011 * -5取反补码: 00000100 * 现在补码是正数: 即结果为:4 */ /*System.out.println("----非运算 ~ -----"); System.out.println(~5); System.out.println(~-5);*/ /** * ^ 异或运算 * 1, 相对应位相同,则结果为0,否则为1: * 例如:110 ^ 110 = 000 --> 0 * 2, 负数运算:-6 ^ 5:(取八位计算) * -6补码:11111010 * 5补码: 00000101 * -6^5补码: 11111111 * 结果反码:11111110 * 原码: 10000001 * 结果:-1 */ /*System.out.println("----异或运算 ^ -----"); System.out.println(6^6); // 110 ^ 110 = 000 ---> 0 System.out.println(6^5); // 110 ^ 101 = 011 --> 3 System.out.println(-6^5); // */ /** * >> 右移 * 右端被移除,左端移入原来最高位,现在最高位是1 * 例子:-5 >> 1: * -5补码:11111011 * 右移1位:11111101 :右端被移除,左端移入原来最高位,现在最高位是1 * 反码: 11111100:减去1 * 原码: 10000011: * 结果: -3 */ /*System.out.println("----右移 >> -----"); System.out.println((4>>2)); // 100 >> 2 = 1 --> 1 System.out.println(8>>2); // 1000 >> 2 = 10 --> 2 System.out.println(4>>1); // 100 >> 1 = 10 -->2 System.out.println(8>>1); // 1000 >> 1 = 100 -->4 System.out.println(-5>>1); // */ /** * << 左移 * 最高位溢出,最低为补0 * */ /*System.out.println(4<<2); // 100 << 2 = 10000 --> 16; System.out.println(10<<2); // 1010 << 2 = 101000 --> 40 */ /** * >>> 无符号右移 * 最低位移除,最高位补零,与 ‘>>’ 最高位移入最高位不同 * 例子:-10>>>2 * -10补码: 11111111 11111111 11111111 11110110 * 右移两位: 00111111 11111111 11111111 11111101 * 结果: 1073741821 */ /*System.out.println(10>>>1); // 1010 >>> 1 = 0101 --> 5 System.out.println(10>>>2); // 1010 >>> 2 = 0010 ---> 2 System.out.println(2>>>3); // 0010 >>> 3 = 0000 ----> 0 System.out.println(-10>>>2); // */ /** * 例子:128 >> 1 returns 128/ 2 = 64 256 >> 4 returns 256/ 16 = 16 -256 >> 4 returns -256/ 16 = -16 16<<2 return 16 * 4 = 64 -16<<2 return -16 * 4 = -64 */ System.out.println(-256>>4); //-16 System.out.println(-32>>2); //-8 System.out.println(16<<2); //16*2*2 = 64 System.out.println(-16<<2); //-16*2*2 = -64 System.out.println(256>>>4); //16 System.out.println(-256>>>4); //268435440 }