要求:计算非负数二进制形式中1的个数.
本文采用两种方法来实现:
1) 通过
Integer#toBinaryString方法获得二进制表达式, 替换掉0,那么剩余的都是1, 然后直接计算剩余字符串的长度来得到1的个数.
2) 采用位运算. 把一个整数减1,然后再与原来整数做与运算(&),会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作.
具体的代码如下:
public class Example {
/**
* 通过Integer#toBinaryString方法获得二进制表达式, 替换掉0,剩余的都是1, 然后直接计算剩余字符串的长度来得到1的个数.
*
*/
public int method1(int num) {
if (num < 0) {
throw new IllegalArgumentException("请输入一个非负整数.");
}
return Integer.toBinaryString(num).replaceAll("0", "").length();
}
/**
* 该方法采用的思想是:
* 把一个整数减1,然后再与原来整数做与运算(&),会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作.
*/
public int method2(int num) {
if (num < 0) {
throw new IllegalArgumentException("请输入一个非负整数.");
}
int count = num == 0 ? 0 : 1;
while ((num = (num & (num - 1))) > 0) {
count++;
}
return count;
}
public static void main(String[] args) {
Example m = new Example();
for (int i = 980; i < 1000; i++) {
System.out
.printf(
"整数%3d的二进制表示为%s,其中1的个数,\nMethod1()的结果是%d,\nMethod2()的结果是%d\n\n",
i, Integer.toBinaryString(i), m.method1(i), m
.method2(i));
}
}
}
简单的测试结果如下:
整数980的二进制表示为1111010100,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数981的二进制表示为1111010101,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数982的二进制表示为1111010110,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数983的二进制表示为1111010111,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数984的二进制表示为1111011000,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数985的二进制表示为1111011001,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数986的二进制表示为1111011010,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数987的二进制表示为1111011011,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数988的二进制表示为1111011100,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数989的二进制表示为1111011101,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数990的二进制表示为1111011110,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
整数991的二进制表示为1111011111,其中1的个数,
Method1()的结果是9,
Method2()的结果是9
整数992的二进制表示为1111100000,其中1的个数,
Method1()的结果是5,
Method2()的结果是5
整数993的二进制表示为1111100001,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数994的二进制表示为1111100010,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数995的二进制表示为1111100011,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数996的二进制表示为1111100100,其中1的个数,
Method1()的结果是6,
Method2()的结果是6
整数997的二进制表示为1111100101,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数998的二进制表示为1111100110,其中1的个数,
Method1()的结果是7,
Method2()的结果是7
整数999的二进制表示为1111100111,其中1的个数,
Method1()的结果是8,
Method2()的结果是8
分享到:
相关推荐
MATLAB中负数8位二进制与10进制之间的转换
Matlab负数十进制转二进制代码 对于基础有用
(word完整版)Matlab负数十进制转二进制代码.doc
java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docxjava 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx
1:正数的二进制第一位数字为0。...2:负数的二进制第一位数字为1。 3:将一个10进制数转成对应的进制,就是不断的取余数的过程。二进制取低位,8进制和16进制取高位。 4:一个数的负数=它的反码+补码1。
负数二进制[总结].pdf
本文档详细介绍了 数字在计算机中时如何用二进制表示的,以及计算机是如何计算减法运算的,简单介绍了数字的原码、反码、补码,没有了解这方面的 请先去了解一点,有助于理解。
将一个整数转换为二进制形式,统计二进制数中1的个数,如果是负数,按补码统计1的个数 def oneNumber(n): print(bin(n)) if n < 0: # 在python中,负数与0xFFFFFFFF按位与,实际上按照语法,负数在做与操作...
任意输入一个十进制整数,包括正数负数,通过程序实现可以输出相应的二进制编码
题目输入一个整数,输出该数32位二进制表示中1的个数(其中负数用补码表示)示例输入输出题解二进制移位法//将 mark0x01 和 n 进行 ‘&’ 运算//
(完整版)Matlab负数十进制转二进制代码.doc
本文件为将二进制图片格式转换为十进制,并以数据和曲线的形式展现。
编程实现从键盘任意输入20个整数,统计非负数的个数,并计算非负数之和。
十六进制转换成二进制,处理负数,二进制最高位是1表示负数,0表示正数。源代码,已测试,
java语言编写的十进制正数和负数转换二进制算法。
1.正数(包括边界值1、0x7FFFFFFF) 2.负数(包括边界值0x80000000、0xFFFFFFFF) 1.与二进制有关的题目要往位运算方面想,复习一
输入一个十进制整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解决思路 这是个位运算的题目。 解法一:可以通过按位与操作,通过将每一位和1与操作来求出1的个数。 解法二(最优解):一个巧妙的方法,...
价值上万的Java精品网课教程\第02天(进制,位运算,语句)
二进制图文详解 二进制Binary 2进制 逢二进一的计数规则。 在计算机内部,一切数据都是2进制的!! 2进制的数字 补码 补码本质是一种解决负数问题的算法。 1. 将数据的一半当做负数使用。 2. 补码在内存中是2...