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,如需转载请自行联系原作者