char型字节取高位和低位

char型字节取高位和低位 最近在做一个查找的东西,必须把一个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); // 这里的位操作数以及位移的数目可以根据自己的需要修改 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xinke453/archive/2011/01/03/6114478.aspx
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在计算机中,一个8字节(64位)的数通常以二进制形式存储。在这种情况下,一个数的高位低位可以通过它二进制表示中的位来区分。 对于一个8字节的数,我们可以将其看作由8个字节组成的数组,每个字节占8位,因此该数共占64位。在这种情况下,该数的低位指的是最右边的字节的8个位,而高位指的是最左边的字节的8个位。 例如,假设一个8字节的数的十六进制表示为 `0x123456789abcdef0`,则它的二进制表示为: ``` 00010010 00110100 01010110 01111000 10011001 10101011 1100 1110 1111 0000 ``` 在该二进制表示中,最右边的8位(即最后一个字节)为 `11110000`,因此它是该数的低位。而最左边的8位(即第一个字节)为 `00010010`,因此它是该数的高位。 在 C 语言中,可以通过位运算来一个数的高位低位。例如,可以使用右移运算符 `>>` 将该数的高位移动到低位,然后使用位与运算符 `&` 低位,如下所示: ```c unsigned long long num = 0x123456789abcdef0; unsigned char low_byte = num & 0xff; // 低位字节 unsigned char high_byte = (num >> 56) & 0xff; // 高位字节 ``` 在该代码中,使用 `unsigned long long` 类的变量 `num` 来存储一个8字节的数,然后使用位与运算符 `&` 和右移运算符 `>>` 出该数的低位高位,并分别存储到 `low_byte` 和 `high_byte` 变量中。需要注意的是,在使用位运算高位时,需要将该数右移 `56` 位,以出最左边的8个位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值