原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1。
获取原码方法: 注:int 类型32位
使用StringBuilder的insert方法:
注:可将字符串插入到字符序列中,索引位置为offset (从0起) 的位置开始
final static char[] digits = {'0' , '1'}; /**获取原码方法,int类型32位 */ private static String toUnsignedString(int value) { StringBuilder sb = new StringBuilder(); int i = 32; int j = value; do { if (j >= 0) sb.insert(0,digits[j % 2]); else sb.insert(0,digits[-(j % 2)]);//因为小于0,所以得出的数值为负数,加上负号转为正数 j /= 2; i--; } while (i > 0); //格式处理一下 if(value < 0) sb.setCharAt(0, '1'); for (i = 0; i < sb.length(); i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); //4位一组 } return sb.toString(); }
注:insert一个,往后推
setCharAt(int i, char c):将索引为i 的代码单元设置为 c(可以理解为替换)
正数的反码 == 原码,负数的反码是在其原码的基础上,符号位(首位)不变,其余各个位取反。
正数的补码 == 原码,负数的补码是在其反码的基础上加1。
总结:
正数:原码 = 反码 = 补码
负数:反码 = 原码符号位不变,其余各位取反 补码 == 反码加1
注:二进制都是由高位到低位
左移(<<):不分正负数,低位补0
右移(>>):正数高位补0,负数高位补1
无符号右移(>>>):不分正负数,高位补0
1> jdk自带方法 Integer.toBinaryString()
private static String binaryToDecimal(int num) { StringBuilder sb = new StringBuilder(); sb.append(Integer.toBinaryString(num));//是有jdk自带方法转为二进制 for (int i = 0; i < 16 - sb.length; i++) {//补齐16位 sb.insert(0, 0); } for (int i = 0; i < sb.length; i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); //四位一组 } return sb.toString(); }
2> 求余,逐个插入
final static char[] digits = {'0' , '1'}; /**获取原码方法,int类型32位 */ private static String toUnsignedString(int value) { StringBuilder sb = new StringBuilder(); int i = 32; int j = value; do { if (j >= 0) sb.insert(0,digits[j % 2]); else sb.insert(0,digits[-(j % 2)]);//因为小于0,所以得出的数值为负数,加上负号转为正数 j /= 2; i--; } while (i > 0); //格式处理一下 if(value < 0) sb.setCharAt(0, '1'); for (i = 0; i < sb.length(); i++) { if((i + 1) % 5 == 0) sb.insert(i, " "); //4位一组 } return sb.toString(); }