移位操作
移位操作只是简单地把一个值的位向左或者向右移动。在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。,如图是个左移位的例子,它在一个8位的值上进行左移3位的操作,以二进制形式显示。这个值所有的位均向移三个位置,移出左边界的那几位丢失,右边空出来的几个位则用0补齐。
右移位操作存在一个左移位操作不曾面临的问题:从左边移入新位时,可以选择两种方案。一种是逻辑移位,左边移入的位用0填充;另一种是算数移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保证原数的正负形式不变。如果值10010110右移两位,逻辑移位的结果是00100101,但算数移位的结果是11100101。算数左移和逻辑左移是相同的,它们只是在右移时不同,而且只有当操作数是负值时才不一样。
左移位操作符为<<,右移位操作符为>>。左操作数的值将移动由右操作数指定的位数。两个操作数都必须为整型类型。
举个栗子
这个例子的操作就是算数移位了。(我的环境是visual studio 2008)
注意
标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值,到底是采用逻辑移位还是算数移位取决于编译器。举个栗子类似这样的移位操作:a << -5,这种操作的结果是表示什么呢?左移-5位,是表示右移五位吗?还是根本不移位,标准说明这种形式是未定义的,所以它是由编译器决定的,所以这种形式的操作的结果是不可预知的,这种形式的操作应该避免。
测试:
写一个小程序测算一下一个整型数据中,值为一的位的个数。(提示:使用右移操作)
#include<stdio.h>
int count_bit_one(unsigned value)
{
int number = 0;
for (;value != 0;value = value >> 1)
{
if (value % 2 != 0)
{
++number;
}
}
return number;
}
int main()
{
int num = 127;
printf("%d\n",count_bit_one(num));
return 0;
}
就先总结这么多吧,继续前进!

1865

被折叠的 条评论
为什么被折叠?



