数据大小端的介绍

  • a. 大小端表示数据在计算机中的存放顺序。

  • b. 大端模式符合人类的正常思维,高字节保存在内存的低地址。

  • c. 小端模式方便计算机处理,高字节保存在内存的高地址。

按位运算,左移、右移运算

当拿到了一个大小端转换完毕的数据,又会面临下一个问题,这个数据中不同的位可能代表了不同的意义(根据与硬件工程师的协议来定义),如何继续拿到对应位的数字呢?这时候,按位运算、左移右移就派上用场了。

1、按位与 &

同为1为1,否则为0

例如:3 & 5

0000 0011

0000 0101

0000 0001 = 1

所以 3 & 5=1

特点:

(1)清零:任何数和0相与,结果为0.

(2)取出指定位的值。取哪一位,就把对应的位定为1。

例如:

我们拿到一个16位的数据X,这个数据的低4位代表了版本号。

就可以利用按位与来拿到这个数字,代码如下

// 0x0f的二进制为0000 1111,所以就取出了低4位的数据
int result = X & 0x0f;复制代码

2、按位或 |

只要有一个为1就为1

负数按补码的形式参加按位或运算

例如:3 | 5

0000 0011

0000 0101

0000 0111 = 7

所以 3 | 5=7

特点:

(1)对数据的某些位置1。

例如:

将X=1010 0000的后四位置1

1010 0000

0000 1111

1010 1111

这样后4位就全为1了

3、异或运算 ^

如果对应的位不同则为1,相同为0

例如 3 ^ 5

0000 0011

0000 0101

0000 0110

所以 3 ^ 5= 6

特点:

(1)特定位翻转,哪一位需要翻转就把对应的位设置为1

(2)任何数和0异或,原值不变。

(3)异或运算可以交换位置:3 ^ 5 ^ 6 == 3 ^ 6 ^ 5

(4)相同的数异或等于0:9 ^ 9 == 0

(5)a ^ b ^ a == b

4、取反 ~

0变1,1变0

例如 ~3

0000 0011

1111 1100

特点:

(1)配合按位与把一个数的最低位设置为0

例如:

把X=1011 0111按位与(~1)

X & (~1) = 1011 0110

这样最后一位就为0了

5、左移运算 <<

二进制位全部左移若干位,左边的丢弃,右边补0

例如 3<<2

0000 0011 = 3

0000 1100 = 12 (左移后)

左移3<<2 == 12

特点:

若左移时舍弃的最高位不包含1,则每左移一位,就乘以一次2.

所以a<<n 就是 a乘以2的n次方

6、右移运算 >>

二进制右移若干位,正数左边补0,负数左边补1,右边丢弃。

例如 12>>2

0000 1100 = 12

0000 0011 = 2 (右移后)

右移12>>2 == 3

特点:

每右移一位,就除以一次2.

a>>n 就是 a除以2的n次方

例如:

继续用上面按位与的例子,

我们拿到一个16位的数据X,这次版本号不是低4位了,而是5-8位,该如何处理呢?

这种情况左移或右移就派上用场了

 

// 0xf0的二进制为1111 0000,与X按位与之后,就取出了5-8位。
// 然后右移4位,最终得到了所需要的数据。
int result = (X & 0xf0) >> 4;

本文链接:https://my.lmcjl.com/post/10299.html

展开阅读全文

4 评论

留下您的评论.