操作符的应用

在不创建临时变量的前提下,交换两个变量的值

//位操作符的运用
//不能创建临时变量(第三个变量),实现两个整数的交换。
// 法一
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d",&a,&b);
//	printf("交换前: a = %d b = %d",a,b);
//	//交换
//	a = a ^ b;
//	b = a ^ b;//b = a^b^b = a^0 = a
//	a = a ^ b;//a = a^b^a = a^a^b = 0^b = b
//	printf("交换后:a = %d b = %d\n",a,b);
//	return 0;
//}

//法二
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d",&a,&b);
//	printf("交换前: a = %d b = %d",a,b);
//	//交换
//	a = a + b;
//	b = a - b;//a + b -b = a
//	a = a - b;//a + b -a = b
//	printf("交换后:a = %d b = %d\n", a, b);
//	return 0;
//}

 

求一个整数存储在内存中的二进制中1的个数。

 

//利用移位操作符 >> 与按位与操作符来解决
//int count_bit1_of_n(int n)
//{
//	int i = 0;
//	int count = 0;
//	for (i = 0; i < 32; i++)//0~31有32次循环
//	{
//		if (((n>>1)&1 == 1))
//		{
//			count++;
//		}
//	}
//
//	return count;
//}
//
//int main()
//{
//	int n = 0;
//	scanf("%d",&n);
//	int r = count_bit1_of_n(n);
//	printf("二进制中1的个数 = %d\n", r);
//	return 0;
//}




//但是前面的方法要循环32次,效率太慢
//最好的方法
//int count_bit1_of_n(int n)
//{
//	int count = 0;
//	while (n)
//	{
//		n = n & (n - 1);
//		count++;
//	}
//	return count;
//}

 编写代码将 13 二进制位序列的第五位改成 1,然后在改为 0

//练习二:二进制为置 0 或置 1
//编写代码将 13 二进制位序列的第五位改成 1,然后在改为 0
// 00000000000000000000000000001101
// 00000000000000000000000000011101
// 00000000000000000000000000001101

//将第五位置 1
// 00000000000000000000000000001101
// 00000000000000000000000000010000
// 用逻辑或
// 00000000000000000000000000011101
//如何得到
// 00000000000000000000000000010000
//这其实就是 00000000000000000000000000000001  向左移动4位
//其实只需要考虑后 5 为 即可
//01101
//10000
//可以观察到01101|0000得后四位正是我们需要的,而前面 13 的 6 到 32 为均为 0 ,逻辑或操作并没有影响结果
//此时 011010000 就是 13 << 4 (向左移动四位)得到的


//把第五位改成1
//int main()
//{
//	int a = 13;
//	a = a | (1<<4);
// //a |= (1 << 4)
// // 4 = 5 - 1;如果题目变为把第 n 位改成 1 ,那就应该写成 (n - 1)
//	printf("%d",a);//29
//	return 0;
//}


//把第五位改回0
// 00000000000000000000000000011101 
// 11111111111111111111111111101111
// 上两个逻辑与就可以
// 00000000000000000000000000001101
//而1111111111111111111111111101111 怎么写
//可以表达为
//  00000000000000000000000000010000 的逻辑取反

//int main()
//{
//	int a = 29;
//	a = a & ~(1 << 4);
//  a &= ~(1 << (5 - 1))
//	printf("%d",a);//13
//	return 0;
//}

 

 

在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。

例如:

数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int func(int arr[],int sz)
{
	int i = 0;
	int ret = 0;
	for (i = 0; i <= sz - 1; i++)
	{
		ret ^= arr[i];
	}
	return ret;
}
int main()
{
	int arr[] = { 1 ,2, 3, 4, 5 ,1 ,2 ,3 ,4 };
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d",func(arr,sz));
}

//原理:两个相同的数相异或等于0,0异或一个数还是等于那个数,且异或操作符满足交换律

 

 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

#define _CRT_SECURE_NO_WARNINGS
// 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

#include<stdio.h>
int print(n)
{
	int i = 0;
	//打印奇数位
	for (i = 30; i >= 0; i-=2)
	{
		printf("%d ",(n >> i) & 1);
	}
	printf("\n");
	//打印偶数位
	for (i = 31; i >= 1; i-=2)
	{
		printf("%d ", (n >> i) & 1);
	}
}
int main()
{
	int n = 0;
	scanf("%d",&n);
	print(n);
	return 0;
}

 

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 

输入例子:

1999 2299

输出例子:7

#define _CRT_SECURE_NO_WARNINGS
//编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同??
//
//输入例子 :
//
//1999 2299
//
//输出例子 : 7
#include<stdio.h>
int func(int a,int b)
{
	int c = 0;
	c = a ^ b;
	//只要算出c中1的个数就行
	int count = 0;
	while (c)
	{
		c = c & (c - 1);
		count++;
	}
	return count;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	printf("%d", func(a, b));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值