黑马程序员技术交流社区
标题:
关于负数十进制转2进制
[打印本页]
作者:
NNERO
时间:
2014-4-23 20:52
标题:
关于负数十进制转2进制
本帖最后由 NNERO 于 2014-4-24 16:56 编辑
首先我知道可以用Integer.toBinary方法直接转,
但是我想自己写一个理解它的概念,我自己的方法如下:
public class Text111 {
public static void main(String[] args) {
int sum = -2153;
System.out.println(toBin(sum));
}
public static String toBin(int sum){
StringBuilder sb = new StringBuilder();
sum=~sum;//按位取反,将其变为正数
sum=sum^0x7fffffff;//变正数后,与2进制数0x7fffffff异或 刚好就是负数2进制,但是这是我自己拼出来的,不理解为何
do{
sb.append(sum%2);//转换后的数,转换为字符串
}while((sum/=2)!=0);
sb.insert(sb.length()-1, "1");//最高位添加1来获得32位二进制数。
return sb.reverse().toString();//调用方法翻转字符串并转为String类型
}
}
复制代码
注释里有地方不太理解。
这个方法貌似不太好,毕老师说负数2进制是该数正数按位取反再加1,但是按位取反可以,加1怎么搞?加1不就是10进制的1么? 怎么才能加二进制1?
没有头绪,有没有其他算法来转换。
作者:
悠然丶
时间:
2014-4-23 21:04
举例说明-3的二进制算法:帮助楼主理解
0000 0000 0000 0000 0000 0000 0000 0011 =3
1111 1111 1111 1111 1111 1111 1111 1100 取反
0000 0000 0000 0000 0000 0000 0000 0001 +1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1111 1111 1111 1111 1111 1111 1111 1101 = -3
作者:
kuroro自走核炮
时间:
2014-4-23 21:08
0x7fffffff
这货就是二进制的11111111-11111111-11111111-11111111
一个正数和这玩意异或就是
00000000-00000000-00000000-01011110(10进制的94,随便找了个数演示。)
11111111-11111111-11111111-11111111
——————————————————异或运算。不同为true即1,相同为false即0,其实就是按位取反了。
11111111-11111111-11111111-10100001就相当于取反了。
然后加1的问题……
16进制的1:0x00000001
8进制的1:00000001
10进制的1:00000001
2进制的1:00000001
11111111-11111111-11111111-10100001
00000000-00000000-00000000-00000001
————————————————————
11111111-11111111-11111111-10100010 负的94
加1……那就是加一嘛……不过你如果要进行字符串修改的话,那就比较麻烦了啊……得先把字符串搞成元素数组,然后判断尾巴上的数组,0就变1,1的话变0还得向前判断进位。
作者:
NNERO
时间:
2014-4-23 22:33
kuroro自走核炮 发表于 2014-4-23 21:08
0x7fffffff
这货就是二进制的11111111-11111111-11111111-11111111
一个正数和这玩意异或就是
果断是比较麻烦了。呵呵,理解了,谢谢
作者:
taulinxinny
时间:
2014-4-24 00:43
同样受教了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2