11、二进制表示中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法
1、除二取余法
- 由于题目没有提供,是多少位的补码。
- 所以我这种方法怎么算,测试案例都过不了。
public int NumberOf1(int n) {
ArrayList<Integer> list=new ArrayList<>();
ArrayList<Long> list1=new ArrayList<>();
if(n==0){
return 0;
}
if(n>0){
while(n>=2){
list.add(n%2);
n=n/2;
}
list.add(n);
int rs=0;
for(int i=0;i<list.size();i++){
if(list.get(i)==1){
rs=rs+1;
}
}
return rs;
}else{
long m =Math.abs((long)n);
while(m>=2){
list1.add(m%2);
m=m/2;
}
list1.add(m);
// 补齐32位
for(int i=list1.size();i<31;i++){
list1.add(0L);
}
if(list1.size()<32){
list1.add(1L);
}
// 取反操作
for(int i=0;i<list1.size()-1;i++){
if(list1.get(i)==0){
list1.set(i, 1L);
}else{
list1.set(i, 0L);
}
}
// 加一操作
long jinwei=1L;
for (int i=0;i<list1.size()-1;i++){
if((list1.get(i)+jinwei)<=1){
list1.set(i, list1.get(i)+jinwei);
jinwei=0L;
break;
}else {
list1.set(i, 0L);
}
}
int rs=0;
for(int i=0;i<list1.size();i++){
if(list1.get(i)==1L){
rs=rs+1;
}
}
return rs;
}
}
2、java现有api:Integer.toBinaryString
public int NumberOf11(int n) {
if(n==0){
return 0;
}
String str =Integer.toBinaryString(n);
int rs=0;
for (int i=0;i<str.length();i++){
if(str.charAt(i)=='1'){
rs++;
}
}
return rs;
}
3、移位运算
- 若一个整数不为0,那么这个整数的二进制表示至少有一位是1
- 将这个整数减1,则原来处在最右边的1就会变成0
- 原来在1后面的所有0,都会变成1。
- 其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1.
减去1以后,变成1011,减1的效果就是把最右边的一个1开始的所有位都取反了此时将n与n-1做与运算,从原来整数最右边的1那一位开始所有位都变成0了.即把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
public int NumberOf(int n) {
if(n==0){
return 0;
}
int rs=0;
while(n!=0){
n=n&(n-1);
rs++;
}
return rs;
}
移位运算:
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n != 0) {
// n的二进制末尾是否为1
count += (n & 1);
n >>>= 1;
}
return count;
}
}