操作符的使用
1.不允许创建临时变量,交换两个整数的内容
这里用到^异或操作符:相异为1,相同为0
用到两个规律
1.a^a=0
2.a^0=a
整体思路:
a=3^3^5==0^5=5
异或是支持交换律的
为证明3^5^3==5
011-->3
101-->5
110--->中间值
|
011-->3
|
101-->5
#include<stdio.h> int main() { int a = 3, b = 5; printf("交换前:%d %d\n", a, b); a = a ^ b; b = a ^ b;//-->b=a^b^b==a^0=a a = a ^ b;//-->a=a^b^a==0^b=b printf("交换后:%d %d\n", a, b); return 0; }
2.写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
思路:
方法1: 统计1的个数,遇到0跳过
//写一个函数返回参数二进制中 1 的个数。 // //比如: 15 0000 1111 4 个 1 //这种算法对负数有点问题 int count_one_bit(int num)//这里要把 int 换成 unsigned int才能统计负数的1的个数 { int count = 0; while (num) { if (num % 2 == 1)//统计1的个数,遇到0跳过 { count++; } num /= 2; } return count; } int main() { int num = 0; scanf("%d", &num); int ret = count_one_bit( num); printf("%d\n", ret); return 0; }
这个写法存在缺陷:
执行效果:
注意:当写成int类型的时候,用的时候是当成原码用的
当把int num换成unsigned int num时
当num等于-1时
-1
10000000000000000000000000000001 -- 原码 —>我们日常生活中使用的
11111111111111111111111111111110 -- 反码
11111111111111111111111111111111 -- 补码
unsigned int 则认为-1补码全为有效位,不存在符号位,
方法2:右移操作符,&1得到最低为二进制最低位
int count_one_bit(int num)//这里参数无论unsigned int 还是int都能拿到每个bit位的&的结果 { int count = 0; int i = 0; for (i = 0; i < 32; i++) { if ((num >> i) & 1 == 1)//num是不会动的,不会改变num的值,下次回来循环的时候num的值还是原来的,变的只是i { count++; } } return count; }
方法3:n=n&(n-1)
int count_one_bit(int num) { int count = 0; while (num)//只要num不为0,num里面就存在1 { num = num & (num - 1);//去掉一个1 count++; } return count; }
原理:
题目类型:接口型和oj型,oj的意思是在线判题
3.获取一个整数二进制序列中所有的偶数位和奇数位分别打印出二进制序列
方法:偶数位和奇数位的最高位和最低位到整个bit位最低位的距离
//记住:获得一个数的最低位,&1就可以了 //获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 //1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 #include<stdio.h> int main() { int num = 0; scanf("%d", &num); int i = 0; //偶数位 printf("偶数位:"); for (i = 31; i >= 1; i-=2) { printf("%d ", (num >> i) && 1); } printf("\n"); //奇数位 printf("奇数位:"); for (i = 30; i >= 0; i-=2) { printf("%d ", (num >> i) & 1); } printf("\n"); return 0; }
以偶数位为例子,图解:
执行效果: