C语言一些关于位操作符的小练习

1.编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7

#include <stdio.h>
#include<stdlib.h>
int count_diff_bit(int m, int n)
{
    int num = m^n;
    int count = 0;
    while(num)
    {
        count++;
        num = num&(num-1);
    }
    return count;
}

int main()
{
    int num1 = 0;
    int num2 = 0;
    int ret = 0;
    while (1)
    {
        printf("请输入你要检测的两个数:\n");
        scanf("%d%d", &num1, &num2);
        ret = count_diff_bit(num1, num2);
        printf("%d", ret);
    }
    system("pause");
    return 0;
}

2.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832。。)
10011000000000000000000000000000
程序结果返回:
2550136832


#include<stdio.h>
#include<stdlib.h>
unsigned int  reverse_bit(unsigned int value)
{
    unsigned int m = 0;
    int i = 0;
    for (i = 0; i < 32-1; i++)
    {
        m |= value & 1;
        m <<= 1;
        value >>= 1;
    }
    return (unsigned int)m;
}
int main()
{
    unsigned int num =0 ;
    unsigned int ret = 0;
    scanf("%u", &num);
    ret = reverse_bit(num);
    printf("%u", ret);
    system("pause");
    return 0;
}

3.不使用(a+b)/2这种方式,求两个数的平均值。

#include<stdio.h>
#include<stdlib.h>
int Average_value(const int num1, const int num2)
{
    int a = num1;
    int b = num2;
    int aver = 0;
    /*aver = a + (b - a) / 2;*/
    aver = (a&b) + ((a^b) >> 1);

    return aver;
}
int main()
{
    int num1 = 0;
    int num2 = 0;
    int ret;
    printf("请输入你所要求平均值的两个数:");
    scanf("%d%d", &num1, &num2);
    ret = Average_value(num1, num2);
    printf("%d", ret);
    system("pause");
    return 0;
}

4.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)

#include<stdio.h>
#include<stdlib.h>

int  search(int arr[], int sz)
{
    int i = 0;
    int m = 0;
    for (i=0; i<sz; i++)
    {
         m^= arr[i];
    }
    return m;
}
int main()
{
    int ret = 0;
    int arr[] = {1,2,3,2,1,4,4,6,6};
    int sz = sizeof(arr) / sizeof(arr[0]);
    ret = search(arr, sz);
    printf("%d", ret);
    system("pause");
    return 0;
}

交换二进制的奇数位和偶数位

例如: 00001010
变成00000101
和前面翻转二进制数其实差不多,我们可以将二进制的从最高位到最低位依次求出,也就是sum,同样的ret如果左移32次的话,就会将最高位丢失,所以让ret=0,先无用的左移一次也就是把ret=ret<<1放到赋值前面,移位并求出最高位的值后,我们就让第31位给到ret的最低位,然后再左移,再让第32位给到最低位。总共执行16次就可以将所有的二进制奇数位和偶数位互换。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int exchange(int val)
{
    int sum = 0;
    int ret = 0;
    int i = 0;
    for (i = 16; i > 0; i--)
    {   
        ret = ret << 1;
        sum = (val >> (2 * i - 2) & 1);
        ret = sum | ret;
        ret = ret << 1;
        sum = (val >> (2 * i - 1) & 1);
        ret = ret | sum;
    }
    return ret;
} 
int main()
{
    int val = 14;
    int num = EX(val);
    printf("%d", num);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值