今天研究了一个有趣的算法,而且还牵连了很多其他知识,这个问题倒是很简单。
问题:求一个数的二进制中1的个数
方法1:
public class YiWei {
/*
* 函数名:count1() 原理:n和1求&,当n的末位是1时,&结果是1;然后把n右移1位,再判断。
* 缺陷:只适用于正数,当n是负数时错误。
* 原因:移位操作的时候,没考虑符号位,会使负数变成正数
*/
public int count1(int n) {
int count = 0; // 计数器
while (n != 0) {
if ((n & 1) != 0) {
count++;
}
n = n >> 1;
}
return count;
}
}
方法2:
public class YiWei {
/*
* 函数名:count2()
* 原理:设置一个变量flag = 1,让flag与n求& ,若结果不是0,
* 则计数器加1;flag左移1位,再比较
* 适用范围:正数,0,负数均可
*/
public int count2(int n) { // 这个方法,正数和负数都适用,
int count = 0;
int flag = 1;
int i = 1;
while (i <= 32) { //移动32次
if ((flag & n) != 0) {
count++;
}
flag = flag << 1;
i++;
}
if ((flag & n) > 0) {
count++;
}
//System.out.println(Integer.toBinaryString(n) );
//System.out.println(Integer.toBinaryString(n).length() );
return count;
}
}
方法3:
public class YiWei {
/*
* 函数名:count3()
* 原理:若n最右边的1在第k个位置,那么n-1之后,第k个位置的数由1变0,k之后的由0变1,k之前的不变。
* 再把n-1和n求& ,会把该整数最右边的1变为0。因此有多少个1,就循环几次。
*/
public int count3(int n) {
//System.out.println(Integer.toBinaryString(n) );
//System.out.println(Integer.toBinaryString(n).length() );
int count = 0;
while (n != 0) {
count++;
n = n & (n - 1);
}
return count;
}
}
方法4:
public class YiWei {
/*
* count4() 使用java提供的方法
* 原理:java提供了Integer到Binary的转换,求出的二进制字符串,存在StringBuilder里,
* 然后循环查找是否有0,如果有,则删除,最后的结果为全是1的字符串,求下length即可
*/
public int count4(int n) {
int count;
StringBuilder s = new StringBuilder(); // 注意用StringBuilder类型,可变字符串。
s.append(Integer.toBinaryString(n));
System.out.println(s);
while (s.indexOf("0") != -1) {// 判断是否有0 存在,若有则删除字符串中所有的0
s.deleteCharAt(s.indexOf("0"));
}
count = s.length();// 此时的字符串s里面存的全是1,求一下length即可知道1的个数
return count;
}
}
这道题牵连到的问题:
1.正数 : 原码 = 反码= 补码
2.负数 : 反码 = (除符号位)按位取反,补码 = 反码 + 1
3.0的补码是0,并且唯一
4.+0的原码 = 0000 0000B
- 0的原码 = 1000 0000B
5. 与运算: n & (n-1) 的特点;n & flag 的结果;1&1=1,其他为0
6. 移位操作:左移(*2) ,右移(/2)
7.Integer类提供的toBinary方法
8.StringBuilder类提供的字符串处理方法
分享到:
相关推荐
C++计算一个数字的二进制中0或1的个数原理及代码
(android demo)算法实现:计算十进制数N的二进制形式中包含数字1的个数
对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效 率尽可能地高。
求二进制数中1的个数
给你一个10进制正整数(小于等于10^6),1010^0110==1100=12 让你把它转换成2进制数,把其中哪一位是1的位数输出, 按升序排列。(比如说13的2进制是1101, 它的第3位是1,第2位是1,第1位是0,第0位是1,所以输出...
课程设计——统计一个数二进制表示中1的个数
判断32位无符号整数二进制中1的个数,与大家分享下。不是原创
从键盘输入一个十进制数,二进制显示 从键盘输入一个十进制数,二进制显示
二进制中 1 的个数请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。示例 1:输入:000000000000000000000000000010
给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。C语言程序附带实验报告
主要介绍了C++求1到n中1出现的次数以及数的二进制表示中1的个数,两道基础的算法题目,文中也给出了解题思路,需要的朋友可以参考下
汇编实现统计输入数据中1的个数,转换为二进制判断
统计整数的二进制表示形式中有几个1(java实现),代码中有三种方法,分别是利用除、余的方法,位运算,以及利用“与”运算的方法。其中第三种方法效率最高,二进制数中有几个1,算法中的循环内的运算就执行几次。
输入一个整十进制数n,把它转化为二进制,小数部分还没有考虑。。。
Delphi - 判断一个二进制数中有多少个1.mht
实验二 数制转换 将一个十六位二进制数转换为十六进制数并在屏幕输出
模拟十进制数到二进制数的转换过程,以LED来模拟各个二进制位,并能以动画方式模拟计数的过程。 选择手动方式时,将8个LED变成滑动条中数字的二进制(基数2)表示。例如,如果滑动条设置为数字10(在二进制中表示为...
基于python的求二进制中1的位数设计实现
二进制数和十六进制数的相互转换 c6下完美运行通过 #include #include #include #include void convert(char *input, char *output) { int len1 = strlen(input); //输入二进制数位数 int pos = len1 / 4 + 1...
二进制中1的个数.md