位操作

移位操作

移位操作只是简单地把一个值的位向左或者向右移动。在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。,如图是个左移位的例子,它在一个8位的值上进行左移3位的操作,以二进制形式显示。这个值所有的位均向移三个位置,移出左边界的那几位丢失,右边空出来的几个位则用0补齐。
右移位操作存在一个左移位操作不曾面临的问题:从左边移入新位时,可以选择两种方案。一种是逻辑移位,左边移入的位用0填充;另一种是算数移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保证原数的正负形式不变。如果值10010110右移两位,逻辑移位的结果是00100101,但算数移位的结果是11100101。算数左移和逻辑左移是相同的,它们只是在右移时不同,而且只有当操作数是负值时才不一样。
left
左移位操作符为<<,右移位操作符为>>。左操作数的值将移动由右操作数指定的位数。两个操作数都必须为整型类型。
举个栗子
test这个例子的操作就是算数移位了。(我的环境是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;
}

bit
就先总结这么多吧,继续前进!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值