-
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 评论