论坛首页 综合技术论坛

计算byte表示的二进制数据中,1出现的次数

浏览 11159 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-02   最后修改:2011-12-05
顺杆爬,简化掉jdk对负数的处理因为负数已经被转化了

	public static int bitCount(byte b) {
		int i = (b>>>31<<7) + (b&0x7F);
		i = (i&0x55)+(i>>>1&0x55);
		i = (i&0x33)+(i>>>2&0x33);
		return (i&0x0F)+(i>>>4);
	}
0 请登录后投票
   发表时间:2011-12-03  
b_l_east 写道
嘎嘎,本人最近刚好用了一下byte,像你这种情况只需不断右移然后和1取与运算就行了。
byte b = ...;

int count = 0;
for (i=0; i<4; i++) {
  if  ((b >> i) & 1) == 1)   count ++;
} 

 

 

 

 

我也是这么想的,移位运算的效率 应该会更高。

0 请登录后投票
   发表时间:2011-12-03  

ErLang的bit string版本。
count1s(<<B1:1,B2:1,B3:1,B4:1,B5:1,B6:1,B7:1,B8:1>>)->B1+B2+B3+B4+B5+B6+B7+B8.
0 请登录后投票
   发表时间:2011-12-04   最后修改:2011-12-04
如果是负数,存的是反码
0 请登录后投票
   发表时间:2011-12-05  
计算二进制数据里有多少个1,有更好的方法:
num=0;
while (byte)
{
  num++;
  byte &=(byte -1 )
}
在编程之美里有阐述,这个是最快的算法,但在实际应用中,如果byte取值范围小,可以用数组保存对应的个数,通过数组直接读取..
0 请登录后投票
   发表时间:2011-12-05  
我以为会用位移和&操作来做
0 请登录后投票
   发表时间:2011-12-05  
yymt 写道
计算二进制数据里有多少个1,有更好的方法:
num=0;
while (byte)
{
  num++;
  byte &=(byte -1 )
}
在编程之美里有阐述,这个是最快的算法,但在实际应用中,如果byte取值范围小,可以用数组保存对应的个数,通过数组直接读取..


这个方法最早见于 K&R C语言编程(第二版)的一道习题.诀窍是 x&(x-1)会消除x最低位的1
0 请登录后投票
   发表时间:2011-12-05  
如果是在java中为啥不作为一个字符串,然后调用split分割然后数组长度即为1的个数
0 请登录后投票
   发表时间:2011-12-06  
直接位移就行了。
0 请登录后投票
   发表时间:2011-12-06  
public static void main(String[] args) {
byte b = 127;
String binary = Integer.toBinaryString(b & 0xff);
System.out.println(binary);
int count = 0;
while (b > 0) {
if ((b & 1) == 1) {
count++;
}
b >>= 1;
}
System.out.println(count);
}
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics