位运算

这里写图片描述
1. 位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。

2. 对于移位操作,在微软的VC6.0和VS2008编译器都是采取算术称位即算术移位操作,算术移位是相对于逻辑移位,它们在左移操作中都一样,低位补0即可,但在右移中逻辑移位的高位补0而算术移位的高位是补符号位。如下面代码会输出-4和3。

int a = -15, b = 15;  
printf("%d %d\n", a >> 2, b >> 2);  

因为15=0000 1111(二进制),右移二位,最高位由符号位填充将得到0000 0011即3。-15 = 1111 0001(二进制),右移二位,最高位由符号位填充将得到1111 1100即-4(见注1)。

3. 位操作符的运算优先级比较低,因为尽量使用括号来确保运算顺序,否则

一些运用

问题:怎样求二进制中“1”的个数(参照《编程之美》(5种解))

这道题很典型,利用位运算,二进制有关的题都能加快处理。(只选取了算法竞赛向的)

解一:不断求n%2
解二:判断二进制最后一位是不是“1”(时间复杂度o(long2 v),等于解一)

int Count(BYTE v)
{
    int num=0;
    while(v){
        num+= v & 0x01;
        v>>=1;
    }return num;
}

解三:用 v&v-1 判断最高位是否为“1”

int Count(BYTE v)
{
    int num=0;
    while(v){
        v&=v-1;
        num++;
    }return num;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值