逻辑移位与算数移位的区别实例分析
本文主要介绍逻辑移位与算数移位的区别,采用了一些实例进行进一步说明,通俗易懂!!
右移
逻辑右移和算数右移是位移操作中的两种不同方式,它们在处理带符号整数时有不同的行为。以下是它们的区别以及示例:
1. 逻辑右移
- 在逻辑右移中,最高位(符号位)不会影响其他位的移动,它仅仅被当做普通位一样右移,而在左侧添加0。
- 逻辑右移适用于无符号整数或希望将带符号整数当作无符号整数进行处理的情况。
示例:
对于无符号整数(例如,uint8_t),逻辑右移不会考虑符号位,只是将每个位向右移动,并在左侧添加0。
0b11011010 >> 2 = 0b00110110
2. 算数右移
- 在算数右移中,最高位(符号位)保持不变,并且右移操作会在左侧添加与符号位相同的位。这意味着正数右移时,在左侧添加0,而负数右移时,在左侧添加1。
- 算数右移用于保持带符号整数的符号和值的完整性。
示例:
对于带符号整数(例如,int8_t),算数右移会考虑符号位,并在左侧添加与符号位相同的位。
0b11011010 >> 2 = 0b11110110
这里,正数 0b11011010
右移2位,添加0,得到 0b00110110
。而负数 0b11011010
右移2位,添加1,得到 0b11110110
。
总结
- 逻辑右移用于无符号整数或不考虑符号位的情况,它会在左侧添加0。
- 算数右移用于带符号整数,保持符号位和值的完整性,它会在左侧添加与符号位相同的位。
左移
逻辑左移(Logical Left Shift)和算术左移(Arithmetic Left Shift)是位移操作,用于将二进制数向左移动指定的位数。它们的区别在于如何处理左侧空位的方式。
逻辑左移(Logical Left Shift)
-
原理:
- 逻辑左移将二进制数的所有位向左移动指定的位数,丢弃最左侧的位,并用0填充右侧的空位。
- 这种操作适用于无符号整数,不考虑符号位,只关注数据位的位移。
-
示例:
原数: 11011010 左移2位:01101000
算术左移(Arithmetic Left Shift)
-
原理:
- 算术左移将二进制数的所有位向左移动指定的位数,丢弃最左侧的位,并用0填充右侧的空位。
- 这种操作适用于带符号整数,左移不会影响符号。
-
示例:
原数: 11011010 左移2位:01101000
总结区别
- 逻辑左移适用于无符号整数,不关心符号位,填充0。
- 算术左移适用于带符号整数,左移不会影响符号,也会用0填充。
这两种左移操作通常用于数据的扩大(左移增加位数,结果变大)或者在某些计算中用于位运算。逻辑左移总是用0填充右侧,而算术左移会丢弃左侧的位,并用0填充右侧,符号位不会受到影响。
写在最后:
为个人学习时的记录,欢迎指正