https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8
这道题思路不难,关键考察如何将十进制转为二进制

除二取余

复习了一下如何“除二取余”运算,但明显这种方法比较臃肿了。
image.png

  1. public static int NumberOf1(int n) {
  2. int binary_n;
  3. // 如果是负数,需要加上2^31次方
  4. if (n < 0) {
  5. binary_n = (int) (Math.pow(2, 31) + n);
  6. } else {
  7. binary_n = n;
  8. }
  9. String strBinary = "";
  10. // 通过除二取余法,求出二进制数,保存在binary
  11. int shang = binary_n;
  12. int yu;
  13. int bit = 0;
  14. while (shang != 0) {
  15. yu = shang % 2;
  16. shang = shang / 2;
  17. bit++;
  18. if (bit % 4 == 0) {
  19. strBinary = " " + yu + strBinary;
  20. } else {
  21. strBinary = yu + strBinary;
  22. }
  23. }
  24. // 不够32位,需要补齐
  25. while (bit < 31) {
  26. bit++;
  27. if (bit % 4 == 0) {
  28. strBinary = " " + "0" + strBinary;
  29. } else {
  30. strBinary = "0" + strBinary;
  31. }
  32. }
  33. //判断符号位
  34. if (n < 0) {
  35. strBinary = "1" + strBinary;
  36. } else {
  37. strBinary = "0" + strBinary;
  38. }
  39. System.out.println(strBinary);
  40. int count = 0;
  41. for (char c : strBinary.toCharArray()) {
  42. if (c == '1')
  43. count++;
  44. }
  45. return count;
  46. }