package com.woo; /*****************[计算器中定点数的表示方式]**************************/ //原码、反码和补码 //在计算机内,定点数有3种表示法:原码、反码和补码 //原码:就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 //反码:表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,[但符号位除外]。 //补码:表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1 /*****************[在Java中所有数据的表示方法都是以补码的形式表示]**************************/ //补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。 //正数的补码是其本身,负数的补码是其绝对值(即正数)取反加1。这里是各位取反,包括了符号位,注意与反码的区别 public class Home { public static void main(String[] args) { //一个字节是8位,最高位为符号位0代表正数1代表负数 byte i = 1; //00000001 byte j = 2; //00000010 //移位 [向左移动两位 表示:1x2*2] System.out.println(i<<2); //00000100 = 4 //移位 [向右移两位 表示:1/(2*2),结果转换为了int所以为0] System.out.println(i>>2); //00000000 = 0 //与 [不同出0,数字1的二进制和数字2的二进制,每一位进行与运算,得到 00000000] System.out.println(i&j); //00000000 = 0 //或 [有1即为1,数字1的二进制和数字2的二进制,每一位都按照该规则进行运算,得到 00000011] System.out.println(i|j); //00000011 = 3 //异或 [不同出1,数字1的二进制和数字2的二进制,每一位进行异或运算,得到 00000011] System.out.println(i^j); //00000011 = 3 /* * 非 [~在java中即对每一位都进行反转,即1变为0,0变为1,得到 11111110,这个是源码。在java中都是以补码的方式表示数据的,因为二进制11111110的最高位为1,即为负数。 * 因为在java中,负数的补码是其绝对值(即正数)取反加1,那么就是: * 11111110的绝对值为:01111110 * 取反[java中取反为每一位都取反]:1111110 取反得到 10000001 * 再加1得到补码:10000010 [最高位为符号位,刚好为 -2] */ System.out.println(~i); } }