介绍完异或的概念我们就可以剖析上述的代码:首先我们可以发现异或有三个性质:1.由于a和a本身每一位都相同,所以按位异或后结果每位都是0,因此 a ^ a = 0 2. 由于0的二进制表示每一位都是0,a中为1的位置与0异或后依然为1,因此 0 ^ a = a 3. 异或满足交换律,a ^ b = b ^ a。 这样的三个性质可以用到上述代码中:
这样一来a和b就通过按位异或巧妙的进行了交换。
2.返回二进制数中1的个数
//思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数intNumberOf1(int n){int count =0;int flag =1;while(flag !=0){if((n & flag)!=0){
count++;}
flag = flag <<1;}return count;}intmain(){int n =0;scanf("%d",&n);int ret =NumberOf1(n);printf("%d", ret);return0;}