A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陌花╮有意、 中级黑马   /  2012-7-18 20:26  /  2040 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是程序中的一个小功能:将十进制转换成二进制 ,用操作每一个二进制位实现
但是在测试最小负数的时候有一个异常,求解决
public class StringToDec {
public static void main(String[] args) {
  // 用正数进行测试
  System.out.println(Integer.toBinaryString(1234567));
  System.out.println(DectoBinary(1234567));
  System.out.println("---------------------");
  // 用负数进行测试
  System.out.println(Integer.toBinaryString(-4534543));
  System.out.println(DectoBinary(-4534543));
  System.out.println("---------------------");
  System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
  System.out.println(DectoBinary(Integer.MAX_VALUE));
  System.out.println("---------------------");
  // 测试最小负数的时候出现问题
  System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));
  System.out.println(DectoBinary(Integer.MIN_VALUE));
}
// 自定义的将十进制数转成二进制数的方法,正负均可
public static String DectoBinary(int number) {
  int remainder;
  int[] arr = new int[32];
  int pos = arr.length - 1; // 指针
  int length = String.valueOf(number).length();
  boolean flag = true, flag_1 = false;
  StringBuilder sb = new StringBuilder();
  // 负数先求得其十进制相反数
  if (number < 0) {
   flag = false;
   number = Integer.parseInt(String.valueOf(number).substring(1));
  }
  while (number != 0) {
   remainder = number % 2;
   number = number / 2;
   arr[pos--] = remainder;
  }
  // 对负数求其二进制
  if (!flag) {
   // 先将每一位变反
   for (int i = 0; i < arr.length; i++) {
    arr[i] = arr[i] ^ 1;
   }
   // 再将变反后的各位加1
   for (int i = arr.length - 1; i >= 0; i--) {
    if (i == arr.length - 1) {
     if (arr[i] == 1) {
      flag_1 = true;
     } else if (arr[i] == 0) {
      arr[i] = 1;
     }
    }
    if (arr[i] == 1 && flag_1) {
     arr[i] = 0;
     flag_1 = true;
    } else if (arr[i] == 0 && flag_1) {
     arr[i] = 1;
     flag_1 = false;
    } else
     flag_1 = false;
   }
   pos = -1;
  }
  for (int i = pos + 1; i < arr.length; i++) {
   sb.append(arr[i]);
  }
  return sb.toString();
}
}

结果:
100101101011010000111
100101101011010000111
---------------------
11111111101110101100111011110001
11111111101110101100111011110001
---------------------
1111111111111111111111111111111
1111111111111111111111111111111
---------------------
10000000000000000000000000000000
Exception in thread "main" java.lang.NumberFormatException: For input string: "2147483648"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:499)
at java.lang.Integer.parseInt(Integer.java:527)
at com.heimestudy.cn.StringToDec.DectoBinary(StringToDec.java:37)
at com.heimestudy.cn.StringToDec.main(StringToDec.java:21)

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

3 个回复

倒序浏览
  1. public class StringToDec {
  2. public static void main(String[] args) {
  3. // 用正数进行测试
  4. System.out.println(Integer.toBinaryString(1234567));
  5. System.out.println(DectoBinary(1234567));
  6. System.out.println("---------------------");
  7. // 用负数进行测试
  8. System.out.println(Integer.toBinaryString(-4534543));
  9. System.out.println(DectoBinary(-4534543));
  10. System.out.println("---------------------");
  11. System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
  12. System.out.println(DectoBinary(Integer.MAX_VALUE));
  13. System.out.println("---------------------");
  14. // 测试最小负数的时候出现问题
  15. System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));
  16. System.out.println(DectoBinary(Integer.MIN_VALUE));
  17. }
  18. // 自定义的将十进制数转成二进制数的方法,正负均可
  19. public static String DectoBinary(int number) {
  20. int remainder;
  21. int[] arr = new int[32];
  22. int pos = arr.length - 1; // 指针
  23. int length = String.valueOf(number).length();
  24. boolean flag = true, flag_1 = false;
  25. StringBuilder sb = new StringBuilder();
  26. // 负数先求得其十进制相反数
  27. if (number < 0) {
  28. flag = false;
  29. number = Integer.parseInt(String.valueOf(number).substring(1));
  30. }
  31. while (number != 0) {
  32. remainder = number % 2;
  33. number = number / 2;
  34. arr[pos--] = remainder;
  35. }
  36. // 对负数求其二进制
  37. if (!flag) {
  38. // 先将每一位变反
  39. for (int i = 0; i < arr.length; i++) {
  40. arr[i] = arr[i] ^ 1;
  41. }
  42. // 再将变反后的各位加1
  43. for (int i = arr.length - 1; i >= 0; i--) {
  44. if (i == arr.length - 1) {
  45. if (arr[i] == 1) {
  46. flag_1 = true;
  47. } else if (arr[i] == 0) {
  48. arr[i] = 1;
  49. }
  50. }
  51. if (arr[i] == 1 && flag_1) {
  52. arr[i] = 0;
  53. flag_1 = true;
  54. } else if (arr[i] == 0 && flag_1) {
  55. arr[i] = 1;
  56. flag_1 = false;
  57. } else
  58. flag_1 = false;
  59. }
  60. pos = -1;
  61. }
  62. for (int i = pos + 1; i < arr.length; i++) {
  63. sb.append(arr[i]);
  64. }
  65. return sb.toString();
  66. }
  67. }

  68. 结果:
  69. 100101101011010000111
  70. 100101101011010000111
  71. ---------------------
  72. 11111111101110101100111011110001
  73. 11111111101110101100111011110001
  74. ---------------------
  75. 1111111111111111111111111111111
  76. 1111111111111111111111111111111
  77. ---------------------
  78. 10000000000000000000000000000000
  79. Exception in thread "main" java.lang.NumberFormatException: For input string: "2147483648"//l<FONT color=red>类型不兼容问题?意思是说,你不能将字符串类型转化成数值类型?去掉"",应该就好</FONT>了
  80. at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  81. at java.lang.Integer.parseInt(Integer.java:499)
  82. at java.lang.Integer.parseInt(Integer.java:527)
  83. at com.heimestudy.cn.StringToDec.DectoBinary(StringToDec.java:37)
  84. at com.heimestudy.cn.StringToDec.main(StringToDec.java:21)
复制代码

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
最小负数-2147483648,取其相反数就是2147483648,超出了int范围???
回复 使用道具 举报
可以用位移实现的 不用考虑正负数问题
每次>>1;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马