-
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; }
更多相关内容 -
计算二进制中1的个数-Java____[位运算思维]
2019-04-24 17:47:01Integer.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 == 1100(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 = 01001 & 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); } }
输出结果:
推荐几篇写的不错的关于此问题的文章
对于判断整数是不是2的整数次方也可以应用这种思想来求解.
思路:如果整数是2的整数次方,那么这个整数的二进制表示中只有一个1,其余都为0,则可以通过n&(n-1)则为0,若为0,则该数为2的整数次方,否则不是2的整数次方. ↩︎
-
HNU JAVA 计算int型二进制1的个数
2021-11-14 14:01:50提供了两种解题方法,一种是直接调用进制转换函数,不过一旦忘了函数怎么写或者是写错了就很难办,于是第二种方法直接利用进制转换的计算可能会更方便一点,函数部分就当是拓展了吧。 代码如下: 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的个数(Java)
2021-11-28 20:23:09统计二进制数中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; } }
-
Java查找输入整数二进制中1的个数(二进制转换)
2022-03-08 20:58:13又是不到半分钟我咔咔觉得这个题不就是用toBinaryString 然后我不到二分钟咔咔写完了下面这个代码 然后牛客咔咔给我反馈答案错误 import java.util.*; public class Main{ public static void main(String[] args){... -
剑指offer-二进制中1的个数
2021-07-13 20:44:14二进制中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的个数。其中负数用补码表示
2019-07-25 00:06:44输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示 考虑与(&)运算 , 每次n和(n-1)与操作 ,就会把对应源原数据n的2进制中的最后一个1变为0 运行时间:16ms 占用内存:9244k public class ... -
查找输入整数二进制中1的个数
2021-08-22 17:28:48查找输入整数二进制中1的个数 分享解题思路解题思路 拿到题首先想到Java编写一个十进制转二进制的方法,然后在主函数里用Scanner函数写入一个输入。十进制转二进制的方法采用的是除2取余法。然后方法返回的是二进制... -
蓝桥杯:算法提高 P0401(三种方法计算二进制中1的个数)
2020-03-05 23:04:55输入一个无符号整数x,输出x的二进制表示中1的个数. 输入: 76584 输出: 7 import java.util.Scanner; public class ToBinary { public static void main(String[] args) { Scanner scanner=n... -
1.4 二进制中1的个数(一题四解)
2019-01-08 22:33:27Problem: 请实现一个函数,输入一个整数num,输出该数二进制表示中1的个数...使用Java中提供的将十进制数字转化为二进制字符串的方法,然后遍历该字符串,数出1的个数. 实现代码: /** * 解法1 * @param num * @r... -
笔试编程题之二进制中1的个数
2019-10-07 20:39:27输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 这里涉及到负数二进制用补码表示,补码是对负数的绝对值按位取反再加1. public class Solution { public int NumberOf1(int n) { String ... -
二进制中字符串中1的个数
2020-04-19 15:57:37求出二进制中字符串中1的个数。 public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int ans = findNumberof1(n)... -
剑指offer 15.二进制中1的个数
2021-01-14 16:54:19文章目录二进制中1的个数二级目录三级目录 二进制中1的个数 题目:请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入... -
2021-03-22 java 求二进制数字中 1的个数
2021-03-22 16:38:56最近刷力扣时 遇到了好几个题目都是计算 数字 的二进制形式中 1的个数,所以特意在此记录一下。 其实最基本的办法就是先求出 数字的二进制,然后去对每一个字符去遍历判断是否为1就可以了,现在就是需要先计算出 ... -
剑指offer(15 二进制中1的个数) 题解
2020-06-01 20:14:27请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 -
输出一个整数在二进制表示中1的个数
2020-04-22 23:53:20问题描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路: 很明显,可以将十进制整数转化为二进制表示字符串,再挨个数“1”的个数。当然,也可以通过除法运算与求余运算相结合解决。 ... -
《剑指Offer》面试题15. 二进制中 1 的个数
2020-05-05 23:15:03请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 1: 输入:00000000000000000000000000001011 ... -
二进制中1的个数-力扣
2020-05-04 16:58:30请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 1: 输入:00000000000000000000000000001011 输出:3 ... -
剑指 offer 刷题——15. 二进制中 1 的个数
2020-07-30 11:46:55请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 1: 输入:00000000000000000000000000001011 输出:3 ... -
二进制中1的个数(Java实现)
2019-10-05 03:46:46问题: 输入一个整数,求其二进制中1的个数 看到这个问题,我们应该想到数的位运算: 解法一:我们每次将此数&1 ,如果结果等于1,证明此数的最后一位是1,,count++; 然后在将数右移一位, 循环下去,直到... -
《剑指Offer》位运算--二进制中1的个数
2018-12-24 21:28:56输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 知识点: 1、计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示... -
8 二进制中1的个数:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数
2019-08-05 14:14:08请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制1001,有2位1。因此如果输入9,该函数输出2。 二、解题思路 ①位移+计数 每次右移一位,不断和1进行与运算,直到位0。 ②循环让(n... -
Java实现输入一个整数,输出该数二进制表示中1的个数
2018-05-21 11:13:20public class Test { ... // 利用Java内置toBinaryString方法来实现 public static int numberOfOne1(int n) { int count = 0; String str = Integer.toBinaryString(n); for (int i = 0; i &... -
剑指Offer15:二进制中1的个数(Java)
2020-08-16 11:22:58输入的是一个十进制数字,首先我们要把它转换成二进制的字符串,定义一个变量存放1的个数。然后每次取出字符串的每位字符,看看是不是1,是1变量就加加。最后返回变量即可。但是这种方法不快,运行时间较长...