关于 位运算 的一些题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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.一组数据中只有一个数字出现了一次,其它所有数字都是成对出现。请找出这个数字:

1
2
3
4
5
6
7
8
9
10
11
12
#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;
}









本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1703782,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值