搜索
bottom↓
回复: 29

C语言中的异或运算

[复制链接]

出0入0汤圆

发表于 2009-4-6 11:32:34 | 显示全部楼层 |阅读模式
异或”运算符(^)

      异或运算符^又被称为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的符号位进行翻转实现取相反数”我不能理解,有高手能帮帮忙吗????

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-4-6 12:08:02 | 显示全部楼层
去看浮点数的存储格式。

出0入0汤圆

发表于 2009-4-6 13:16:47 | 显示全部楼层
不仅如是,如果浮点数 乘以或者 除以 2的整数幂,也可以通过 加减法 来完成(不必调用浮点库)

不过要注意,这种写法 没有可移植性。
在某个编译器上能用,在另外的编译器未必能用。

出0入0汤圆

发表于 2009-4-6 16:27:39 | 显示全部楼层
我不知道你是不是问取反的问题,把带符号的2进制数弄明白就好了……

出0入0汤圆

 楼主| 发表于 2009-4-9 00:06:03 | 显示全部楼层
我主要是想问((unsigned char *)&f)[0] 这个表达式 是什么意思 看起来像个数组

出0入0汤圆

 楼主| 发表于 2009-4-9 00:08:52 | 显示全部楼层
或者说(unsigned char *)&f 是什么意思
unsigned char *   指的是什么

出0入0汤圆

发表于 2009-4-9 01:06:09 | 显示全部楼层
强制数据类型转换

出0入0汤圆

发表于 2009-4-9 09:18:13 | 显示全部楼层
((unsigned char *)&f)[0] 可以换成另一种等效的写法: *((unsigned char *)&f)
其含义是:先取浮点数f的地址(也就是:&f),然后强迫编译器认为这个地址是一个char型变量的地址(也就是:unsigned char*,更专业的说法就是“强制类型转换”),最后对这个char变量(实际上就是f的第一个字节)进行操作。
需要注意:
“&f”相当于一个指针(地址),指向浮点数f;
“(unsigned char*)&f”仍然相当于一个指针(地址),指向f的第一字节;
“[0]”或者“*”的作用是把指针(地址)变成它所指向的变量(位于该地址的存储单元)。
((unsigned char *)&f)[0] 看起来像个数组元素,事实上C语言对数组的操作就是利用指针实现的,数组名就相当于一个指针(指向第一个元素),下标就相当于地址偏移量,下标加上外面的方括号[]就相当于“*”(根据地址取内容)操作。

出0入0汤圆

 楼主| 发表于 2009-4-9 17:58:14 | 显示全部楼层
谢谢13楼 !!

出0入0汤圆

发表于 2009-4-10 10:57:22 | 显示全部楼层
13楼?现在有13楼吗?

出0入0汤圆

发表于 2009-4-10 10:58:52 | 显示全部楼层
哈哈

出0入0汤圆

发表于 2010-8-17 22:43:25 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-8-25 16:55:16 | 显示全部楼层
值得看下

出0入0汤圆

发表于 2010-8-25 17:58:29 | 显示全部楼层
8楼不用谢我,太不好意思了。

出0入0汤圆

发表于 2010-9-25 14:40:27 | 显示全部楼层
谢谢了

出0入0汤圆

发表于 2010-10-10 19:25:31 | 显示全部楼层
哈哈,看过了

出0入0汤圆

发表于 2010-12-1 15:26:47 | 显示全部楼层
哈哈哈~

出0入0汤圆

发表于 2010-12-1 15:35:47 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-12-1 16:30:54 | 显示全部楼层
看下。学习下

出0入0汤圆

发表于 2011-5-20 16:38:19 | 显示全部楼层
发现一个错误:

((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数  

不应该是[0],而应该是[3]应该是:

((unsigned char *)&f)[3]^=0x80; //将浮点数f的符号位进行翻转实现取相反数  

出0入0汤圆

发表于 2011-5-20 20:45:12 | 显示全部楼层
回复【19楼】gha20028  
发现一个错误:
((unsigned char *)&f)[0]^=0x80; //将浮点数f的符号位进行翻转实现取相反数  
不应该是[0],而应该是[3]应该是:
((unsigned char *)&f)[3]^=0x80; //将浮点数f的符号位进行翻转实现取相反数  
-----------------------------------------------------------------------
这个与endian相关。
Keil C51是采用big endian存放的,IAR 8051又是使用little endian存放...

出0入0汤圆

发表于 2011-5-21 16:26:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-23 17:45:12 | 显示全部楼层
【20楼】 theophilus

这个与endian相关。
Keil C51是采用big endian存放的,IAR 8051又是使用little endian存放...
-----------------------------------------------------------------------

谢谢theophilus !学习了!

出0入0汤圆

发表于 2011-5-23 18:35:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-23 20:55:15 | 显示全部楼层
jh

出0入0汤圆

发表于 2011-10-29 10:25:40 | 显示全部楼层
记号学习。

出0入0汤圆

发表于 2012-7-9 12:40:46 | 显示全部楼层
谢谢,学习了

出0入0汤圆

发表于 2012-8-29 18:22:06 | 显示全部楼层
学习了,哈哈。。。。。

出0入0汤圆

发表于 2012-9-24 17:12:24 | 显示全部楼层
学习了,谢谢主!

出0入0汤圆

发表于 2014-1-9 15:42:25 | 显示全部楼层
xiexie
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 09:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表