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

《剑指offer》:

首先熟悉一下java自带的进制之间转换的api:

/*
java中进行二进制,八进制,十六进制,十进制间进行相互转换
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()
*/

当然这题要求并不能用api做:

参考方法如下:

先上代码:

 1 package LinkNodeExm;
 2
19 public class offer11 {
20     public static void main(String[] args){
21         int num = NumberOf1(47);
22         System.out.println(num);
23     }
24     public static int NumberOf1(int n) {
25         /*String binarynum = Integer.toBinaryString(n);
26         int count = 0;
27         //int num[] = new int[binarynum.length()];
28         for(int i=0;i<binarynum.length();i++){
29             if(binarynum.charAt(i)==‘1‘){
30                 count++;
31             }
32         }
33         return count;*/
34         int count = 0;
35         while(n!=0){
36             count++;
37             n = n&(n-1);
38         }
39         return count;
40     }
41 }

代码原理如下:

如果一个整数不为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,就可以进行多少次这样的操作。

原文地址:https://www.cnblogs.com/fanghuiplus/p/9472560.html

时间: 2024-10-10 05:34:06

输入一个十进制整数,输出该数二进制表示中1的个数。其中负数用补码表示的相关文章

【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)

输入一个整数,输出该数二进制表示中1的个数.如输入32,输出1. 代码实现: 方法1:与运算 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOneNumber(unsigned int num) {     int numberofOne = 0;     while (num)     {         num = num & (num - 1);         

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

输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: n &(n-1)把n的最右边的1去掉,用count++计算1的个数  eg: 101 & 100 = 100   1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count = 0; 5             while(n!=0){ 6                 count++; 7                 n = n&

剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)

1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位为1.每次向左移位一下,使得flag的二进制表示中始终只有一个位为1,每次与n做位与操作,这样就相当于逐个检测n的每一位是否是1.unsigned int flag = 1; 3. C++核心代码 3.1 位运算 1 class Solution { 2 public: 3 int NumberOf1(int

三种方式求: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示

package com.example; public class Solution { /* * 转化成2进制数计算 */ public int NumberOf1(int n) { String string = Integer.toBinaryString(n); int count = 0; for (int i = 0;i < string.length();i++) { if (string.charAt(i) == '1') { count++; } } return count;

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

public class Solution { public int NumberOf1(int n) { int index = 1; int number = 0; while(index!=0){ if((n & index)!=0) number++; index = index << 1; } return number; } } 先上第一种 两种方法.第一种,是用位运算,将1每次左移,和数字进行&运算,如果成功,则返回1.   第二种,将整数通过方法转换为二进制数,

编程练习:输入一个整除,输出该二进制表示中1的个数。负数用补码表示。

这个题有点不太适合Python,因为python的变量是没有类型声明的. 下面的代码值考虑正数情况: 1 #!/usr/bin/env python3 2 3 def count_1(num): 4 count = 0 5 while num != 0: 6 count += 1 7 print(count) 8 num = num & (num-1) 9 return count 10 11 if __name__ == "__main__": 12 print(count_

N11-该数二进制表示中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. package new_offer; /** * 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. * @author Sonya * */ public class N11_NumberOf1 { public int NumberOf1(int n) { String bstring=Integer.toBinaryString(n);// System.out.print("转换成的二进制字符串:

【任意输入一串整数输出该数的位数】新手每天学写C程序(1)

#include"stdio.h" int main() { int a; int n=0; scanf("%d",&a); n++; a=a/10; while(a>0) { n++; a=a/10; } printf("%d",n); return 0; } [任意输入一串整数输出该数的位数]新手每天学写C程序(1)

9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数

/** * 功能:给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数. * (一个略大一个略小.) */ 三种方法: 方法一:蛮力法 方法二:位操作法 <span style="white-space:pre"> </span>/** * 方法:位操作法 * 思路:获取后一个较大的数 * 1)计算c0和c1.c1是拖尾1的个数,c0是紧邻拖尾1的作坊一连串0的个数. * 2)将最右边.非拖尾0变为1,其位置为p=c1+c0. * 3)将位p