在不创建临时变量的前提下,交换两个变量的值
//位操作符的运用
//不能创建临时变量(第三个变量),实现两个整数的交换。
// 法一
//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;
}