关于计算机数到bit位的判断方式
目前有一些朋友询问关于计算机码的bit位识别判定问题,即给定一个数,判断其某一位是否为1或0。其实这个问题在网上有很多种解决方式,可能有些繁琐,在此把自己的一些见解和方法给大家分享一下。要了解计算机中存储和传输数据的方式,那就得从硬件高低频信号源来讲,信号源为高低电平信号的变化就形成了1,0两种信息的表现方式。这正是计算机的所有信息传输其实就是由1,0码组成,因此计算机中的任何数最终转换都会形成1,0码,即二进制编码。计算机中数值常以整数和浮点数表示(还应其它类型数据,不同开发语言定义不同,所占字节数不同,有符号或无符号之分),但各个数之间均可转换,通常计算某一位,常以整数二进制来判定。
例:[以Java中short占2个字节来算:2*byte(8)=16 bit] 1201 -> 100 10110001 -> 00000100 10110001 假定给出计算函数checkBit(short num,int index) 其中num为整数,index为需要判断确定的哪一位是否为1,如1201这个数,测试它的第5位是否为1,则num=1201,index=5。
方式1:将二进制位转成二进制字符串,然后对每个字符进行判断。
1) 转换成二进制字符串
private String checkBitS(short num)
{
String str="";
for(int i=16;i>0;i--)
str += (num >> (i-1)) & 0x1;
return str;
}
2) 判定位
private boolean check(String str,int index)
{
boolean flag=false;
flag=str.substring(16-index, 16-index+1).equals("1") ? true : false;
return flag;
}
字符串是从左至右的低位,而二进制则是从右向左,因此需要用字节位16减作为转换。以上判定位可以用方式三或四,直接return返回,一条指令,当然也可将以上两函数合并,分开只是更好的说明原理。
方式2:用十六进制位匹配和右移方式
private boolean checkBit(short num,int index)
{
boolean flag=false;
switch(index)
{
case 1:
flag = ((num & 0x0001) >> (index-1) == 1) ? true : false;
break;
case 2:
flag = ((num & 0x0002) >> (index-1) == 1) ? true : false;
break;
......
case 5:
flag = ((num & 0x0010) >> (index-1) == 1) ? true : false;
break;
.......
case 16:
flag = ((num & 0x8000) >> (index-1) == 1) ? true : false;
break;
default:break;
}
return flag;
}
省略号部分依次类推,如上式第16位,则:1000 0000 0000 0000 -> 0x8000
方法3:用数学函数二的倍数方式
private boolean checkBitTone(short num,int index)
{
return ((num & (int)(Math.pow(2, index-1)))) == (int)(Math.pow(2, index-1)) ? true : false;
}
方法4:二的倍数和右移方式
private boolean checkBitTtwo(short num,int index)
{
return ((num & (int)(Math.pow(2, index-1))) >> (index-1)) == 1 ? true : false;
}
因此综上所述,第三,四种方式比较简洁,借助了函数计算。一,二两种方式适用于没有函数的情况下使用,谨此与大家共冕,欢迎大家有更好的方式提出来了分享。
----------------于20150712晨-----------------
阅读(2276) | 评论(0) | 转发(0) |