快捷搜索: 王者荣耀 脱发

字节与位运算(附带题目)

首先分析题目,a,b皆为1一个字节(char),val为2个字节(short) ps:int为4字节,8个2进制位为一个字节=2个16进制位;

那么short类型刚好能放下2个char类型的数据。那么这里就会有一个问题,我需不需要类型转换呢? 答案是不需要的,这里是位运算,类型在地址中存放的时候,只是告诉我这个类型需要占用多大的地址空间。

所以答案是val=a<<8|b;;把a=0x01向左(高位)偏移8位,即0x0100,因为低8位会自动补0;然后再或上b=0x02,因为0或任何数为任何数,并且会放在低8位,不要问我为什么,就是从低地址开始放~

有人就会问 ,为什么这里小端字节序(LSB)没有管他呢? 因为这个小端字节序在这里是迷惑我们的;LSB只是负责数据在内存的储存的顺序,和大端字节序(MSB)相对应。

嗷 后来有个朋友说我这个不对 ,应该是val=a<<8|(b&0xff),我想这不是一样吗。为此我还专门试一下,如图: 实践是检验真理的唯一标准,其实这两个是一样的。。至少在这个题目里面是的; 但是这个b&0xff真的没有必要吗?我们再来想一想,如果这个b是short或者int类型呢? First;我们先看short b ,虽然我定义是2个字节但是我只赋值了一个字节。而 b&0xff 了还是0x02再和a=0x0100 或。和题目的一样。 Second;我们再看 short c ,我赋值了2个字节 ,再和a=0x0100或。 如果没有把c 与上0xff,就会发现区别。第一个0x0100或运算0x1234 得到0x1334;而第二个就是0x0100或运算0x0034得到0x0134。

So that 我再想一想,这个“&0xff” 到底是什么意思呢?我再实验一次; 就会发现 ,只会取最低的8位,那其他的那些位去哪了? 那我再取指针来试一试他们到底在哪? 我们会发现 ,他们还放内存里面的,就会发现这里的储存顺序就是倒着的,ptr[0]指向低地址,发现是0x78,就是数据的低位放在内存中低地址 ,代表我这个系统是小端字节序LSB。

经验分享 程序员 微信小程序 职场和发展