码迷,mamicode.com
首页 > 其他好文 > 详细

关于 位运算 的一些题

时间:2015-10-17 19:22:15      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:位运算

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

#include<stdio.h>
int main()
{
    int a = 0,b = 0,end = 0;
    int count = 0;
    printf("请输入两个数字:\n");
    scanf("%d%d",&a,&b);
    end = a & b;
    while(end)
    {
        count++;
        end = end & (end - 1);
     }
     //用于求end中有多少个1
    printf("共有%d个bit位不同!",count);
    return 0;
}
2.编写函数:unsigned int reverse_bit(unsigned int value);这个函数返回:   值value的二进制位模式从左到右翻转后的值。如值 25: 00000000 00000000 00000000 00011001翻转后为:
                        2550136832:10011000 00000000 00000000 00000000 。
#include<stdio.h>
unsigned int reverse_bit(unsigned int value)
{
   int i = 0;
   unsigned int ret = 0;
   for(i=0;i<32;i++)
   {
      ret += ((value>>i) & 1)<<(31-i);
   }
   return ret;
}
int main()
{
     unsigned int num = 0;
     printf("请输入一个数:\n");
     scnaf("%d",&num);
     printf("%d翻转后的值为%d",num,reverse_bit(num));
     return 0;
}
3.不使用(a+b)/2这种方式求两个数的平均值:
#include<stdio.h>
int main()
{
     int a = 0,b = 0,avg = 0;
     printf("请输入两个数:\n");
     scnaf("%d%d",&a,&b);
     avg = (a & b) + (a ^ b) >>1;
     printf("这两个数的平均值为%d",avg);
     return 0;
}             
或者:
#include<stdio.h>
int main()
{
     int a = 0,b = 0,avg = 0;
     printf("请输入两个数:\n");
     scnaf("%d%d",&a,&b);
     avg = a - (a - b)>>1;
     printf("这两个数的平均值为%d",avg);
     return 0;
}

4.一组数据中只有一个数字出现了一次,其它所有数字都是成对出现。请找出这个数字:

#include<stdio.h>
int main()
{
     int arr[] = {1,1,22,22,3,44,44,55,55};
     int i = 0,find = 0;
     for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
     {
         find = find ^ arr[i];
     }
     printf("这个数是%d\n",find);
     return 0;
}

          

本文出自 “练习水仙花数感悟” 博客,请务必保留此出处http://10704527.blog.51cto.com/10694527/1703782

关于 位运算 的一些题

标签:位运算

原文地址:http://10704527.blog.51cto.com/10694527/1703782

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!