同事代码中的"异或^"操作把我秀翻了~
The following article is from 最后一个bug Author bug菌
来源丨经授权转自 最后一个bug(ID:unknown_bug)
大家好,我是bug菌!
1
眼中的异或操作
A XOR B result
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
2
异或神技
1
半加法运算
参数Demo:
#include <stdio.h>
/***********************************
* Function: AddXor
* Author : bug菌
* Description:异或加法
**********************************/
int AddXor(int a,int b)
{
int c = 0;
c = a^b;
b = (a&b)<<1; //两数相与,如果存在相同位为1,则不为0,左移1位,供下面继续进位处理
while(b) //b!=0,表示存在进位需要处理
{
a = c;
c = a^b;
b = (a&b)<<1;
}
return c;
}
/***********************************
* Function: main
* Author : bug菌
* Description:主函数
**********************************/
int main(int argc, char *argv[])
{
int a = 123;
int b = 55;
printf("%d + %d = %d\n",a,b,AddXor(a,b));
printf("欢迎关注:最后一个bug");
return 0;
}
运算结果:
并不是所有的加法运算都需要进位,比如1024=0x400与一个小于1024的正数之和是不会产生进位的,并且一旦累计进位,相当于在原来的基础上-1024,比如1025^1024=1,可以达到限制数据大小的目的。
2
不用第三变量交换两个数
A = A ^ B;
B = A ^ B;
A = A ^ B;
A = A ^ B; .............(1)
B = A ^ B; .............(2)
A = A ^ B; .............(3)
(2) => B = (A ^ B) ^ B => B = A
(3) => A = (A ^ B) ^ (A) => A = B
3
固定位翻转
0 ^ 1 = 1
1 ^ 1 = 0
当然这里bug菌只是聊了一下翻转LED,思路还可以更加的开阔~
4
不用条件语句实现整数绝对值
A ^ 0xFF.. = ~A
A ^ 0 = A
正数的绝对值为原值,而负数的绝对值为取反+1.
那么当看到上面两个性质,以一个8位有符号数为例子,其最高位为符号位,正数为0,负数为1,那么把一个8位有符号数右移7位。
如果是正数最高位补0,最终数值为0;
如果是负数最高位补1,最终数字为0xFF,也就是-1。
参数Demo:
#include <stdio.h>
/***********************************
* Function: abs_s8
* Author : bug菌
* Description:只能用于8位,32位自行扩展即可
**********************************/
char abs_s8(char a)
{
char b = 0;
b = a >> 7;
a = (a ^ b) - b;
return a;
}
/***********************************
* Function: main
* Author : bug菌
* Description:主函数
**********************************/
int main(void)
{
printf("abs_s8(55) = %d....\n",abs_s8(55));
printf("abs_s8(-55) = %d....\n",abs_s8(-55));
printf("\n欢迎关注最后一个bug\n");
return 0;
}
运行结果:
4、美团外卖小哥竟开发阿里云盘,抢先首发!代码已开源,收割600星
点分享
点点赞
点在看