关于位操作符的一些题目

  1. 写一个函数返回参数二进制中 1 的个数
    比如: 15 0000 1111 4 个 1
#include<stdio.h>
#include<stdlib.h>
int One_Number(int n) {
	int count = 0;
	for (int i = 0; i <sizeof(int)*8; i++) {
	//按位与,只有两个都为1结果才为1
		if ((n&1) == 1) {
			count++;
		}
		//n右移一位
		n= n>> 1;
	}
	return count;
}
int main() {
	int n = 100;
	printf("%d\n", One_Number(n));
	system("pause");
	return 0;
}
  1. 获取一个数二进制序列中所有的偶数位和奇数位,
    分别输出二进制序列。
#include<stdio.h>
#include<stdlib.h>
void every_number(int k) {
	int n = k;     //记下参数
	//求奇数位
	//利用按位与即可得到每一位
	printf("奇数位:");
	for (int i = 0; i <sizeof(int)*8; i+=2) {
		printf("%d",(k&1));
		k=(k >> 2);
	}
	printf("\n");
	//求偶数位
	printf("偶数位:");
	n = n >> 1;
	for (int j = 0; j <sizeof(int)*8; j+=2) {
		printf("%d", (n & 1));
		n = n >> 2;
	}
}
int main() {
	int k =22;
	every_number(k);
	printf("\n");
	system("pause");
	return 0;
}
  1. 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
    输入例子:
    1999 2299
    输出例子:7
#include<stdio.h>
#include<stdlib.h>
int Different_Count(int n1, int n2) {
	int count = 0;
	for (int i = 0; i <sizeof(int)*8; i++) {
		if ((n1 & 1) != (n2 & 1)) {
			count++;
		}
		n1=n1 >> 1;
		n2=n2 >> 1;
	}
	return count;
}
int main() {
	int n1 = 1999, n2 = 2299;
	printf("%d\n", Different_Count(n1, n2));
	system("pause");
	return 0;
}
  1. 编写函数:
    unsigned int reverse_bit(unsigned int value);
    这个函数的返回值value的二进制位模式从左到右翻转后的值。

如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832

#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(int n) {
	unsigned int k = 0;
	int a[32] = { 0 };
	for (int j = 0; j < 32; j++) {
		k = k << 1;           //将最后一位左移        
		k= k|((n >>j) & 1);        //获取n的每一位,并将其赋给k的最后一位
	}
	return k;
}
int main() {
	int n = 25;
	printf("%u\n", reverse_bit(n));
	system("pause");
	return 0;
}
  1. 不使用(a+b)/2这种方式,求两个数的平均值。
//右移一位相当于除2的一次方,左移相当于乘2的1次方
#include<stdio.h>
#include<stdlib.h>
int average(int a, int b) {
	int c = 0;
	c = (a + b) >> 1;
	return c;
}
int main() {
	int a = 15, b = 17;
	printf("%d\n", average(a, b));
	system("pause");
	return 0;
}
  1. 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
    请找出这个数字。(使用位运算)
#include<stdio.h>
#include<stdlib.h>
int main() {
	int a[] = { 1,2,3,1,2,3,4 };
	//按位异或,相同为0,不同为1
	for (int i = 1; i < sizeof(a) / sizeof(int); i++) {
		a[0] = a[0] ^ a[i];
	}
	printf("%d\n", a[0]);
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值