2-3.按位异或^
深入点了解^:纯粹的按位或
🎈规则:
逐比特位,相同为0,不同为1
🎈刷题翻译:
支持结合律和交换律
任何数和0异或,都是他本身
🎈用法:
int c=3^5;//为例 printf("%d",c);
图示:
🎈代码结果:
三. 三道实战题
3-1.求一个正数的二进制序列中有几个1
🎈思路:n = n & (n - 1);
🚗1.设这个正数n,n-1就是使n-1的二进制的原码/补码少1;
🚗2.再将n与n-1按位与,由按位与的性质,n和n-1的二进制的最后一位一定相差1,肯定就是一个1,一个0,按位与后就是0,每进行一次就使得n减少一个1;
🚗3.给个循环,当n全为0时结束,最后循环的次数就是这个正数的二进制序列中有几个1。
🎈图示:
代码:
#include<stdio.h> int main1() { //1.求一个正数的二进制序列中有几个1 int n = 0, count=0; scanf("%d", &n); while (n) { n = n & (n - 1); count++; } printf("这个数的二进制序列中有%d个1", count); return 0; }
🎈运行结果:
3-2.现有两个正数m,n,m的二进制序列要改变多少多少处可以得到n
🎈整体思路:
🚗1.先进行异或操作 如c=a^b; c得到的是a,b变量二进制中不同的地方,标记为1(a,b均为正数)
🚗2。相当于求异或后不同之处(已标记为1)1的个数,即为题一思路
🎈代码:
#include<stdio.h> int main() { // 2.现有两个正数m,n,m的二进制序列要改变多少多少处可以得到n int m = 0, n = 0, temp = 0, count = 0; scanf("m=%d n=%d", &m, &n); temp = m ^ n; while (temp) { temp = temp & (temp - 1); count++; } printf("m的二进制序列要改变%d处可以得到n", count); }
🎈结果:
3-3.不使用第三个变量,交换两个数的值(答案😇)
🎈代码:
#include<stdio.h> int main() { //3.不使用第三个变量,交换两个数的值(答案😇) int a=0, b=0; scanf("a=%d b=%d", &a, &b);; printf("交换前:a=%d\tb=%d\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("交换后:a=%d\tb=%d\n", a, b); return 0; }
🎈图示:
🎈运行结果:
最后,到这里就结束了,码字不易,耗时耗力,欢迎三联一波。🙌🙌🙌
想了解更多位运算的应用题目,速戳位运算题目合集
❤️关注我一起成长 ❤️