大家好,又见面了,我是你们的朋友全栈君。
$a = 2;
$b = ($a<<6) & 0xFF;
var_dump($b);die;
代码如上 最后结果是 128 。
$a 二进制 左移6 位 相当于 $a * 2^6 (2的6次方)。
现在告诉你后边的 &0xFF 是什么鬼东西。这个东西的有无并不会影响计算结果,但严格意义上说应该有。
因为前边的位移运算是二进制算法,计算结果是一个二进制数据,byte类型的数字要&0xff再赋值给int类型,其本质原因就是想保持二进制补码的一致性。
当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样。这样做的目的就是为了保证二进制数据的一致性。
计算机存储数据机制:正数存储的二进制原码,负数存储的是二进制的补码。 补码是负数的绝对值反码加1。
比如-12,-12 的绝对值原码是:0000 1100 取反: 1111 0011 加1: 1111 0100
byte –> int 就是由8位变 32 位 高24位全部补1: 1111 1111 1111 1111 1111 1111 1111 0100 ;
0xFF 是计算机十六进制的表示 0xFF的二进制表示就是:1111 1111。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150782.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...