Chinaunix首页 | 论坛 | 博客
  • 博客访问: 620867
  • 博文数量: 105
  • 博客积分: 10013
  • 博客等级: 上将
  • 技术积分: 985
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-31 21:04
个人简介

窥天地之奥 达造化之极

文章分类

全部博文(105)

文章存档

2015年(1)

2010年(3)

2009年(2)

2008年(2)

2007年(2)

2006年(95)

分类: Java

2015-07-12 02:13:03

关于计算机数到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晨-----------------

阅读(2222) | 评论(0) | 转发(0) |
0

上一篇:C语言 字符串和数字转换函数

下一篇:没有了

给主人留下些什么吧!~~