异或”运算符(^)
异或运算符^又被称为XOR运算符。当参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’。不同时为‘1’。即相同为0,不同为1。
0^0=0; 0^1=1; 1^0=1;1^1=0;
例如:
a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a
异或运算主要有以下几种应用:
1.翻转某一位
当一个位与‘1’作异或运算时结果就为此位翻转后的值。如下例:
a=0x35; //a=0b00110101
a=a^0x0f; //a=0b00111010 a的低四位翻转
关于异或的这一作用,有一个典型的应用,即取浮点的相反数,具体的实现如下:
f=1.23; //f为浮点型变量 值为1.23
f=f*-1; //f乘以-1,实现取其相反数,要进行一次乘运算
f=1.23;
((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数
上面是一遍介绍异或运算的说明,其中的最后一行“((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数”我不能理解,有高手能帮帮忙吗????
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
其含义是:先取浮点数f的地址(也就是:&f),然后强迫编译器认为这个地址是一个char型变量的地址(也就是:unsigned char*,更专业的说法就是“强制类型转换”),最后对这个char变量(实际上就是f的第一个字节)进行操作。
需要注意:
“&f”相当于一个指针(地址),指向浮点数f;
“(unsigned char*)&f”仍然相当于一个指针(地址),指向f的第一字节;
“[0]”或者“*”的作用是把指针(地址)变成它所指向的变量(位于该地址的存储单元)。
((unsigned char *)&f)[0] 看起来像个数组元素,事实上C语言对数组的操作就是利用指针实现的,数组名就相当于一个指针(指向第一个元素),下标就相当于地址偏移量,下标加上外面的方括号[]就相当于“*”(根据地址取内容)操作。
一周热门 更多>