随想杂谈--二进制数据移位操作的问题
最近在写程序时遇到一个有趣的问题,就是一个二进制数据获取另一个二进制数据高位或低位的数据时,是应该先获取数据再移位,还是先移位再获取数据。显然,这两种操作出来的结果是截然不同的,通过对代码的每一步进行跟踪就可以很清晰的明白两者之间的差别。
void get_bit (void)
{
int a = 6; /*< 二进制为0110 */
int b = 0;
for(int i=0;i<4;i++) /*< 获取变量a的低4位,先获取数据再移位 */
{
b |= a & 1;
b <<= 1;
a >>= 1;
}
}
执行上面的代码:
-
b |= a & 1: b = 0000;
b <<=1 : b = 0000;
a >>=1 : a = 0011; -
b |= a & 1: b = 0001;
b <<=1 : b = 0010;
a >>=1 : a = 0001; -
b |= a & 1: b = 0001;
b <<=1 : b = 0110;
a >>=1 : a = 0000; -
b |= a & 1: b = 0110;
b <<=1 : b = 1100;
a >>=1 : a = 0000;
从上面的过程中可以发现,最后执行出来的结果与a的结果不相符,故此种方法为错误的。
接下看看先移位再获取数据的方法:
void get_bit (void)
{
int a = 6; /*< 二进制为0110 */
int b = 0;
for(int i=0;i<4;i++) /*< 获取变量a的低4位,先移位再获取数据 */
{
b <<= 1;
b |= a & 1;
a >>= 1;
}
}
执行上面的代码:
-
b <<=1 : b = 0000;
b |= a & 1: b = 0000;
a >>=1 : a = 0011; -
b <<=1 : b = 0000;
b |= a & 1: b = 0001;
a >>=1 : a = 0001; -
b <<=1 : b = 0010;
b |= a & 1: b = 0011;
a >>=1 : a = 0000; -
b <<=1 : b = 0110;
b |= a & 1: b = 0110;
a >>=1 : a = 0000;
从上面的过程中可以发现,最后执行出来的结果与a的结果相符,故此种方法为正确的。