添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我们先演示流程并获取结果:

  1. 0xFFF8 转 二进制: 1111 1111 1111 1000 ,这是带符号的二进制数据,首位为 1 ,因此是负数;
  2. 负数是用补码表示的,补码是原码取反+1,也就是说需要先减 1 得到: 1111 1111 1111 0111
  3. 取反得到: 0000 0000 0000 0000 1000 ,转10进制就是 8 ,加上符号就是 -8 ,没错,这就是我想要的结果。

~ 操作符转换演示

$a = 0xFFF8;
$ret = ~$a;
var_dump($ret); // 输出:-65529

结果和我想要的不一样啊,那来捋一下 ~ 操作符的计算流程,我们用简单的值演示一下:

  1. 0x0005 转 二进制:0000 0000 0000 0101
  2. 取反得到:1111 1111 1111 1010, 观察取反后的结果,从左向右看,第一位 0正1负;
  3. 负数是用补码表示的,补码是除符号位外按位取反+1,也就是说 1111 1111 1111 1010 是某个数取反+1得到的,反过来,也就是先 -1,结果是:1111 1111 1111 1001
  4. 取反得到: 1000 0000 0000 0110,转10进制就是-6

看过上面的流程就可以发现啦,一直以为0xFFF8是原数,所以就作按位取反,当然结果一直不对,因为转换方式和数据分析 都是错的,数据是从硬件内存中取出直接上传的,而负数在内存中以补码形式存在,因此数据已经是补码了,再按位取反当然就不对了。

正确转换方式

$a = 0xFFF8;
$ret = $a - 0xFFFF - 1;
var_dump($ret); // 输出:-8

没错,就是这么简单!当然,这个是针对 2字节的数据的,如果是4字节,将 0xFFFF 改为 0xFFFFFFFF 就可以啦~

当然,以上纯粹针对小白。。。

十六进制格式的带符号二进制转十进制计算方法`~` 操作符转换演示正确转换方式这个问题必须记录一下,我以为转换就是直接按位取反,但是结果总是不对,经过分析后才发现数据分析就有问题,那当然接下来怎么做都不会对了计算方法我们先演示流程并获取结果:0xFFF8 转 二进制:1111 1111 1111 1000 ,这是带符号的二进制数据,首位为 1 ,因此是负数;负数是用补码表示的,补码是...
意思是把一个带符号二进制 化为对应的十进制,比如这个二进制首位是1,那么化过来的10进制是个负,这个二进制是用一个10进制来表示的。应该自己不会看晕了吧。代码是复制别人的,谢谢那位同学,载了一下。 http://bbs.csdn.net/topics/390051765#new_post //把带符号二进制直接换成十进制,这个二进制是10进制表示的
关于二、十、十六进制互相换的方法 1.二进制十进制。 **方法一:**二进制十进制要从右到左用二进制的每个去乘以2的相应次方(次方从0开始),再将其每个进行相加。 例如:1101十进制:(1乘2的0次方)+(0乘2的1次方)+(1乘2的2次方)+(1乘2的3次方)=1+4+8=13。 **方法二:**采用二进制相位从右往左排列相加,1则加,0则不加,具体如图: 即1+4+8=13。 2.十进制二进制。 方法一:采用除二取余,倒序排列组合为二进制。 方法二:十二则与二十相反,十二采用与相
载自:https://jingyan.baidu.com/article/8ebacdf0133c2f49f65cd5d0.html https://jingyan.baidu.com/article/a501d80c6b3057ec630f5e21.html 正情况下 十进制二进制 此处以18为例讲解下如何求解它的二进制,及由二进制换回十进制。 将18进行除2取余,将余写在后面 将取得的余排成一行。 将余从前往后排徐,写的字列即是二进制二进制十进制
在计算机编程过程中,各种进制的换很多,二进制十进制在C语言中有强制换的方式。在CAN报文解析的时候,从据中取出的二进制端,长度可能不是正好一个字节,这个时候如果要求据是有符号的,需要单独写程序。 首先我们需要理解有符号和无符号变量的区别,以1个字节十进制为例,有符号的取值范围为-127~+127,无符号取值范围为0-255;那么同一组二进制据在成有符号和无符号变量时有什么关联呢? 通常我们将二进制据进行反码、补码计算,再进行换,计算比较复杂。 假设一个二进制据为1000..
012A=0 X 163 + 1 X 162+ 2 X 161 + 10 X 160 = 298 说明:当中的十六进制:a=10 b=11 c=12 d=13 e=14 f=15 第二种:迂回法 将十六进制换为二进制换为十进制(第一种小伙伴们或许不好理解,第二种容易理解) 1A首先二进制:0001 1010 lenth = len(str1) #求字符串长度 for i in range(1,lenth): if str1[i] == '1': #判断该二进制各位值为1或0,为1则进行后续计算 save = 2**(lenth-i-1)