DataLab

文章介绍了三个C语言函数:intbitCount用于统计二进制数中1的个数,intilog2通过位操作判断整数是否大于2^n,logicalShift则演示了利用移位操作处理补码数据。这些函数展示了在编程中对二进制位操作的巧妙应用。
摘要由CSDN通过智能技术生成

int bitCount(int x) 
{
    int mask1 = 0x55;
    int mask2 = 0x33;
    int mask3 = 0x0F;
    int result = 0;
    mask1 = mask1 | (mask1 << 8);
    mask1 = mask1 | (mask1 << 16);
    mask2 = mask2 | (mask2 << 8);
    mask2 = mask2 | (mask2 << 16);
    mask3 = mask3 | (mask3 << 8);
    mask3 = mask3 | (mask3 << 16);
    result = (x & mask1) + ((x >> 1) & mask1);
    result = (result & mask2) + ((result >> 2) & mask2);
    result = (result & mask3) + ((result >> 4) & mask3);
}

这里采用了一个很巧妙的方式统计一个二进制数里1的个数,我们先从一个简单的例子看起

如果是统计只有两位的二进制数,比如10,我们先将其和01相与得到00,然后将其向右移一位之后与01相与得到01,然后将其相加便得到10中含有1的个数。

int ilog2(int x) 
{
    int result=0;
    int b4=!!(x>>16);
    int b3=0;
    int b2=0;
    int b1=0;
    int b0=0;
    result = b4<<4;
    b3 = !!(x>>(8 + result));
    result |= (b3<<3);
    b2 = !!(x>>(4 + result));
    result |= (b2<<2);
    b1 = !!(x>>(2 + result));
    result |= (b1<<1);
    b0 = !!(x>>(1 + result));
    result |= b0;
    return result;
}

此题的解体思路有点类似二分的思想,先将一个32位整型数分成高十六位和低十六位,如果高十六为有1存在,那么这个数至少比2^16大,那么我们接着看高十六位的低八位。如果高十六没有1存在,那么我们就需要看低16位的高八位,以此类推。

int logicalShift(int x, int n) 
{
    int mask=1;
    mask<<=31;
    mask>>=n;
    mask<<=1;
    mask=~mask;
    x>>=n;
    return x&mask;
}

这个题目主要利用移位的操作,计算机存储数据以补码的形式,所以算术右移的时候是补充的符号位,我们构造的mask就是前面是n个0,后面全是1即可。构造的方式就是先将一个1移到符号位,然后右移补充的都是1再进行取反操作就OK了,这里值得注意的是我们是先向右移动n次,再向左移动1次,这样我们就可以应对n=0的情况了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值