精华内容
下载资源
问答
  • 算法计算二进制中1个数
    2020-05-27 10:26:14

    负的二进制数在内存以该数的补码存储、计算

    /**
     * 二进制中1的个数
     * @param aLong :二进制数
     * @return 1的个数
     */
    public static long toLong(String bi) {
       long r = 0;
       for (int i = 0; i < 64; i++) {
          char c = bi.charAt(i);
          long l = (long) Character.digit(c, 2);
          l = l << (63 - i);
          r |= l;
       }
       return r;
    }
    
    更多相关内容
  • Integer.toBinaryString(n)获得输入整数的二进制数,然后再String类charAt(int i)方法依次取二进制字符串每个字符与1进行比较,通过累加得到1个数 第二种: 核心(n & (1 << i)) == (1 << ...

    需求

    实现一个函数,输入一个整数,输出该数二进制表示中1的个数


    实现方法解析


    第一种:
    Integer.toBinaryString(n)获得输入整数的二进制数,然后再用String类中的charAt(int i)方法依次取二进制字符串中每个字符与1进行比较,通过累加得到1的个数


    第二种: 核心(n & (1 << i)) == (1 << i)

    例:9的二进制为1001.
    1001 & 1(1<<0) == 1(1<<0)

    1001 & 10(1<<1) == 0

    1001 & 100(1<2) == 0

    1001 & 1000(1<<3) == 1000(1<<3)
    通过for循环,将1依次向左移,和n相与,当n所在位是1的话,所得的值刚好等于1左移后的值.


    第三种: 核心((n >> i) & 1) == 1

    例:9的二进制为1001.
    1001(1001>>0) & 1 == 1

    100(1001>>1) & 1 == 0

    10(1001>>2) & 1 == 0

    1(1001>>3) & 1 == 1
    通过for循环,将n依次向右移,和1相与,当所求值等于1,即n所在位是1


    第四种: 核心n = (n-1) & n1
    被称作快速法.
    通过消除最高位的1来计算所消除1的个数即为所求的1的个数.
    n-1再和n相与,即可将最高位的1消除,直到等于0,即消除完了所有的1.

    例:9的二进制为1001.
    错误方式: 1001 - 1 & 1001 = 1000 & 1001 = 1(想成异或了…)
    1 -1 & 1 = 0

    1001 & 1000 = 1000
    1000 & 111 = 0
    执行两次为0, 因此9的二进制1的个数为2.


    完整代码演示

    import java.util.Scanner;
    
    /**
     * 需求: 实现一个函数,输入一个整数,输出该数二进制表示中1的个数
     * 
     * @author Clearlight
     *
     */
    public class BinOneNum {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int num = sc.nextInt();
    		binOneNum(num);// 不涉及算法,通过Java中提供的方法
    		leftMoveOne(num);// 将1左移
    		rightMoveOne(num);// 将n右移
    		andNum(num);// 快速法
    	}
    
    	public static void binOneNum(int n) {
    		String bin = Integer.toBinaryString(n);
    		int oneNum = 0;
    		for (int i = 0; i < bin.length(); i++) {
    			if (bin.charAt(i) == '1') {
    				oneNum++;
    			}
    		}
    		System.out.println(bin);
    		System.out.println(oneNum);
    	}
    
    
    	public static void leftMoveOne(int n) {
    		int count = 0;
    		// 比对每一位
    		for (int i = 0; i < 32; i++) {
    			if ((n & (1 << i)) == (1 << i)) {
    				count++;
    			}
    		}
    		System.out.println(count);
    	}
    
    	public static void rightMoveOne(int n) {
    		int count = 0;
    		for (int i = 0; i < 32; i++) {
    			if (((n >> i) & 1) == 1) {
    				count++;
    			}
    		}
    		System.out.println(count);
    	}
    	
    	public static void andNum(int n) {
    		int count = 0;
    		while(n!=0) {
    			n = (n-1) & n;
    			count++;
    		}
    		System.out.println(count);
    	}
    }
    
    

    输出结果:
    在这里插入图片描述
    在这里插入图片描述


    推荐几篇写的不错的关于此问题的文章

    快速法详细分析


    解答该题方法超全


    1. 对于判断整数是不是2的整数次方也可以应用这种思想来求解.
      思路:如果整数是2的整数次方,那么这个整数的二进制表示中只有一个1,其余都为0,则可以通过n&(n-1)则为0,若为0,则该数为2的整数次方,否则不是2的整数次方. ↩︎

    展开全文
  • 提供了两种解题方法,一种是直接调用进制转换函数,不过一旦忘了函数怎么写或者是写错了就很难办,于是第方法直接利用进制转换的计算可能会更方便一点,函数部分就当是拓展了吧。 代码如下: package week1.demo...

    【问题描述】

    输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

    【输入形式】

    输入一个整数int类型

    【输出形式】

    这个数转换成2进制后,输出1的个数

    【样例输入】

    5

    【样例输出】

    2

    总体思路:
    提供了两种解题方法,一种是直接调用进制转换函数,不过一旦忘了函数怎么写或者是写错了就很难办,于是第二种方法直接利用进制转换的计算可能会更方便一点,函数部分就当是拓展了吧。

    代码如下:

    package week1.demo;
    
    import java.util.Scanner;
    
    //计算int型二进制1的个数
    public class Hwork7 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int cnt = 0;//声明一个计数器,存储int型二进制1的个数
            int input = sc.nextInt();
            String temp = Integer.toBinaryString(input);//整型转化为二进制
            //此处用了整型转为二进制型的函数,若不想用函数也可参考下面的代码,感觉操作起来没什么大区别,还是看大家的习惯吧
            int l = temp.length();
    
            for(int i = 0; i < l; i++)
            {
                char ch = temp.charAt(i);
                if(ch == '1') cnt++;
            }
            System.out.println(cnt);
        }
    }
    
    package week1.demo;
    
    import java.util.Scanner;
    
    public class Hwork7_2 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int input = sc.nextInt();
            int cnt = 0;
    //刚刚现写的代码,因为最近在学模电和数电,对二进制的计算了解更加透彻了一丢丢,这个代码看起来比直接调用函数的还要更简洁一点,不是吗~~~
            while(input > 0){
                if(input % 2 == 1) cnt ++;
                input /= 2;
            }
    
            System.out.println(cnt);
        }
    }
    
    展开全文
  • 统计二进制中1个数 (牛客网—牛客题霸算法篇—NC120) 题目描述 输入一个整数 n ,输出该数32位二进制表示中1个数。其中负数补码表示。 数据范围:−2147483648<=n<=2147483647 思路 Java实现 先...

    统计二进制数中1的个数

    (牛客网—牛客题霸算法篇—NC120)

    题目描述

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

    数据范围:−2147483648<=n<=2147483647

    在这里插入图片描述
    在这里插入图片描述

    思路

    Java实现
    先判断数据n的正负,如果是负数的话,令n=-n,然后将n转化成二进制数,再遍历统计1的个数。

    需要注意的当n=−2147483648时,转化成正数时会出现越界的情况,要把−2147483648单独处理。

    代码实现

    public class Solution {
    //进制转化
        public String convert(int M) {
            // write code here
            if(M==0)
                return "0";
            StringBuffer sb=new StringBuffer();
            while(M!=0){
                sb.append(M%2);
                M=M/2;
            }
            return sb.reverse().toString();
        }
    //统计1的个数
        public int NumberOf1(int n) {
            if(n==0)
                return 0;
            if(n==-2147483648)
                return 1;
            int num=0;
            boolean flag=true;
            if(n<0){
                n=-n;
                flag=false;
            }
            String s=convert(n);
            for(int i=0;i<s.length();i++){
                if(s.charAt(i)=='1')
                    num++;
            }
            if(flag==false){
                num=num+(32-s.length());
            }
            return num;
        }
    }
    
    展开全文
  • 又是不到半分钟我咔咔觉得这个题不就是toBinaryString 然后我不到分钟咔咔写完了下面这个代码 然后牛客咔咔给我反馈答案错误 import java.util.*; public class Main{ public static void main(String[] args){...
  • 二进制中1个数题目描述算法思路思路一思路二代码实现实现一实现二 题目描述 输入一个整数,输出该数32位二进制表示中1个数。其中负数补码表示。 示例 输入:10 返回值:2 算法思路 思路一 将十进制转化为...
  • 二进制中1个数

    2020-09-04 20:35:03
    输入一个整数,输出该数32位二进制表示中1个数。其中负数补码表示。 代码 public class Solution { public int NumberOf1(int n) { String binaryString = Integer.toBinaryString(n); int sum = 0; for ...
  • 输入一个整数,输出该数二进制表示中1个数。其中负数补码表示 考虑与(&)运算 , 每次n和(n-1)与操作 ,就会把对应源原数据n的2进制的最后一个1变为0 运行时间:16ms 占用内存:9244k public class ...
  • 查找输入整数二进制中1个数 分享解题思路解题思路 拿到题首先想到Java编写一个十进制转二进制方法,然后在主函数里Scanner函数写入一个输入。十进制转二进制方法采用的是除2取余法。然后方法返回的是二进制...
  •  输入一个无符号整数x,输出x的二进制表示中1个数. 输入:  76584 输出:  7 import java.util.Scanner; public class ToBinary { public static void main(String[] args) { Scanner scanner=n...
  • Problem: 请实现一个函数,输入一个整数num,输出该数二进制表示中1个数...使用Java提供的将十进制数字转化为二进制字符串的方法,然后遍历该字符串,数出1个数. 实现代码: /** * 解法1 * @param num * @r...
  • 输入一个整数,输出该数二进制表示中1个数。其中负数补码表示。 这里涉及到负数二进制用补码表示,补码是对负数的绝对值按位取反再加1. public class Solution { public int NumberOf1(int n) { String ...
  • 求出二进制中字符串中1个数。 public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int ans = findNumberof1(n)...
  • 文章目录二进制中1个数二级目录三级目录 二进制中1个数 题目:请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示 1个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入...
  • 最近刷力扣时 遇到了好几个题目都是计算 数字 的二进制形式 1个数,所以特意在此记录一下。 其实最基本的办法就是先求出 数字的二进制,然后去对每一个字符去遍历判断是否为1就可以了,现在就是需要先计算出 ...
  • 请实现一个函数,输入一个整数,输出该数二进制表示中1个数。其中负数补码表示。
  • 问题描述: 输入一个整数,输出该数二进制表示中1个数。其中负数补码表示。 思路: 很明显,可以将十进制整数转化为二进制表示字符串,再挨个数“1”的个数。当然,也可以通过除法运算与求余运算相结合解决。 ...
  • 请实现一个函数,输入一个整数,输出该数二进制表示 1个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 1: 输入:00000000000000000000000000001011 ...
  • 请实现一个函数,输入一个整数,输出该数二进制表示 1个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 1: 输入:00000000000000000000000000001011 输出:3 ...
  • 请实现一个函数,输入一个整数,输出该数二进制表示 1个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 1: 输入:00000000000000000000000000001011 输出:3 ...
  • 问题: 输入一个整数,求其二进制中1个数 看到这个问题,我们应该想到数的位运算: 解法一:我们每次将此数&1 ,如果结果等于1,证明此数的最后一位是1,,count++; 然后在将数右移一位, 循环下去,直到...
  • 输入一个整数,输出该数二进制表示中1个数。其中负数补码表示。 知识点: 1、计算机的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是0表示“正”,用1表示...
  • 请实现一个函数,输入一个整数,输出该数二进制表示中1个数。例如把9表示成二进制1001,有2位1。因此如果输入9,该函数输出2。 二、解题思路 ①位移+计数 每次右移一位,不断和1进行与运算,直到位0。 ②循环让(n...
  • public class Test { ... // 利用Java内置toBinaryString方法来实现 public static int numberOfOne1(int n) { int count = 0; String str = Integer.toBinaryString(n); for (int i = 0; i &...
  •     输入的是一个十进制数字,首先我们要把它转换成二进制的字符串,定义一个变量存放1个数。然后每次取出字符串的每位字符,看看是不是1,是1变量就加加。最后返回变量即可。但是这种方法不快,运行时间较长...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,917
精华内容 2,766
关键字:

计算二进制中1的个数用charat方法

友情链接: CD_20100810.zip