题目:输入一个整数,输出该二进制表示中1的个数。其中负数用补码表示。

首先明确补码的定义:

原码 反码 补码

将最高位作为符号位(0表示正,1表示负),

其它数字位表达数值本身的绝对值的数字表示方式

如果是正数,则表示方法和原码一样;

如果是负数,符号位不变,其余各位取反。

如果是正数,则表示方法和原码一样;

如果是负数,则将数字的反码加上1

(相当于将原码数值位取反然后在最低位加1)

0的反码、补码都为零。

原数 原码 反码 补码
6 00000110 00000110 00000110
-6 10000110 11111001 11111010

代码:

自己的代码:

 import java.lang.*;
public class Solution {
public int NumberOf1(int n) {
String temp = Integer.toBinaryString(n);
int len = temp.length();
int zs = 0;
int cur = len;
if (n>0){
for(int i = 0;i < cur; i++){
char ch = temp.charAt(i);
if(ch == '1')
zs = zs+1;
}
return zs;
}
else if(n == 0)
return 0;
else{
int fz = 0;
for(int j = len;j > 0 ; j--){
char ch = temp.charAt(j-1);
if(ch == '1')
{}
else
{
zs = zs + 1;
cur = j;
break;
}
}
for(int i = 0;i < cur; i++){
char ch = temp.charAt(i);
if(ch == '1')
zs = zs+1;
}
return zs;
}
}
}

运行总是报错,于是参考别人讨论中的方法,发现Java中自带这个函数:

 public class Solution {
public int NumberOf1(int n) {
return Integer.bitCount(n);
}
}

能逮着耗子的就是好猫~Java学习的首要任务就是掌握其自带函数,这样才能更加省力地学习。

同时学习了讨论中强推程序:

 public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
}

这里是利用了一个二进制数字本身性质:

链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8
来源:牛客网
        如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

        举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

有待进一步研究~另外自己的示例是由问题的~

最新文章

  1. C#基础:LINQ 查询函数整理
  2. github设置只识别指定类型的文件
  3. Linux CentOs7 下安装 redis
  4. zabbix架构
  5. 1287. Mars Canals(DP)
  6. Spring AOP实现方式一【附源码】
  7. Android Studio中使用Gradle打包
  8. hdoj 3549 Flow Problem(最大网络流)
  9. javascript操作正则表达式对象的方法总结
  10. 开发技巧(3-1)Eclipse查找关键字
  11. C语言之将无符号字符型转化为ascii码值
  12. nginx、swoole高并发原理初探
  13. Ajax的注意事项
  14. Luogu2570 [ZJOI2010]贪吃的老鼠 ---- 网络流
  15. windows10系统定时1分钟执行php(不借助windows的.bat文件)原创
  16. [aaronyang] nodejs学习-mongodb[1]
  17. Mac eclipse 快捷键 f6、f8 失效
  18. mysql show full processlist
  19. 最简单的java多线程代码(重写thread或者runnable的run方法)
  20. Appium与Robotium区别

热门文章

  1. Canvas名侦探柯南-canvas练习
  2. lettuce行为驱动总结
  3. 【oracle入门】数据库系统结构----三级模式
  4. 20155208徐子涵 Exp4 恶意代码分析
  5. PTA——黑洞数
  6. Opensource Licenses
  7. python socket 函数介绍
  8. Makefile中的ifeq 多条件使用
  9. Django 小饭桌项目实战笔记
  10. Day 05 可变不可变、数据类型内置方法