二进制原码、反码、补码
原码
原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为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();
}