字符/数字取高位和低位

时间:2021-02-17 06:40:57

字符数字取高位和低位

最近在做一个查找的东西,必须把一个8为的字节分为两个部分,即把他们分为高四位和低四位的两个数据。因为一直是用的别人的一个比较的方式,自己也没有仔细的去看,大部分的情况下都是对的,但是直到出现了问题,不得不解决的时候。煞费苦心的找到了问题的症结所在。解就是上面的字节的拆分。

我先列举一下别人的求法:

char temp=0x86      (0x表示十六进制数据)

char higth=(temp-temp%0x10)/0x10

char low=temp%0x10

上面的方法乍一看是很对的,也很有道理。求高位是上这个数本身减去除16得到的余数,这个数理论上16的倍数,然后用这个数除16得到的应该是高位的数据。

低位数据用数据本身除16取余即可。

但是,你在vc6.0上实验一下,应该得到的是高位为9,低位为6。为什么有这样的错位,这是因为计算机当中有有符号和无符号数据之分,上面的数据被看成了有符号的数据,temp被当成了负数来处理。

解决问题的方法:

经过细心的发现了上面的问题后,我给出了两种解决这种问题的方法:(c 语言)

第一种:这一中是基于上面的原理的,出现问题是由于数据时负数,只要在定义的时候定义成正数就行了。即

unsigned char temp=0x86;

unsigned char  higth=(temp-temp%0x10)/0x10

unsigned char  low=temp%0x10

第二种:第一种方式容易犯错误,给出了第二种方式是基于c语言中可以有位运算

char temp =0x86

char hight=(temp&0xf0)>>4    // 这里的位操作数以及位移的数目可以根据自己的需要修改

char low=temp&0x0f         // 这里的位操作数以及位移的数目可以根据自己的需要修改

即首先把数据当中的高四位通过与运算得到,然后再右移四位,这种方法要注意,括号不能少了,这是因为与运算的优先级低于右移运算的优先级

同样的方式获得低四位的数据,这时候就不要再右移了,哈哈!

第二种方式不管是有符号还是无符号都是适应的。

下面是对应的C# 实现方法:

            byte a = 0xF9;
            string high = Convert.ToString((a & 0xff00) >> 8);      // 这里的位操作数以及位移的数目可以根据自己的需要修改
            string low = Convert.ToString(a &0x00ff);       // 这里的位操作数以及位移的数目可以根据自己的需要修改