C语言位运算的应用(2)

1,比较两个数中有多少个不同的位?

第一种方法:
分别取出两个数字的每一位,然后进行比较,不同计数器加一,可以统计出来。

int Diff_num_bit(int a, int b)//比较两个数不同位的个数
{
    int temp1 = 0;
    int temp2 = 0;
    int count = 0;
    for (int i = 0; i < 32; i++)
    {
        temp1 = a & 1;
        a >>= 1;
        for (int j = 0; j < 1; j++)
        {
            temp2 = b & 1;
            b >>= 1;
        }
        if (temp1 != temp2)
        {
            count++;
        }
    }
    return count;
}

第二种方法:利用位运算来进行统计。我们知道异或运算的运算规则是相同位结果是0,不同位结果是1。
例如

int a=3;//011
int b=4;//100
int c=a^b;//111--->>7

我们可以统计c里面有多少个1,结果便是a,b中不同位的个数。

int Diff_num_bit(int a, int b)//比较两个数不同位的个数
{
    int temp = a^b;
    int count = 0;
    while (temp != 0)
    {
        count++;
        temp = temp&(temp - 1);
    }
    return count;
}

可以看出位运算的巧妙运用可以将程序的时间复杂度和算法精简起来。

2,一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。

上个问题中介绍了异或运算的规则,那么可以知道相同的数字异或运算的结果是0。所以可以利用这个特点来解决这个问题

int main()
{
    int arr[] = {1,2,3,1,2,3,5};
    int i = 0;
    int ret = 0;
    for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    {
        ret ^= arr[i];
    }
    printf("%d\n", ret);
    return 0;
}

相同的数字异或运算后结果为0,那么剩余的那个单独的数字就是要找的。

3判断整数n是否为2的正整数幂

解释:2的正整数冪就是指 2,4,8,16,32,64,128,256,512,1024,2018………….等数字。
在位运算应用(1)中,求解一个数位1的个数时候用了n&(n-1)的方法。在此重新来看这个问题
这里写图片描述
通过上图可以发现2的i次幂的数字和这个数字减一所得数字做位与运算结果位0;
依次特点和结论可以得出下面的算法代码

int ispow(int n)
{
    if ((!(n&(n - 1))) && n >1)
        return 1;
    else
        return -1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值