| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6693 人关注过本帖, 1 人收藏
标题:用位运算实现简单的加减法~
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
 问题点数:0 回复次数:3 
用位运算实现简单的加减法~
以前不怎么理解怎么用位运算进行加减乘除运算,现在可以理解加减运算了,并且自己弄了个出来(乘除或者也可以自己弄出来,但感觉还需要一段时间整理,就先不弄了)~

现在看上去个人感觉很容易理解,就是不知道其他人能理解多少了,看到下面代码后,是感觉不知道在说啥,还是了解个大概,还是像看到家一样熟悉?这就看对编程有多少感觉了~

其实,至少之前不理解的,现在就是自己弄了一下,就能了解个大概,然后稍微弄一下,代码出来了,就像看到家一样熟悉了……就拿出来做个标记吧~

程序代码:
#include<stdio.h>

unsigned un_add( unsigned,unsigned );
int add( int,int );

int sub( int,int );

int main( void )
{
    const unsigned a=6;
    const unsigned b=4;
    
    const int c=3;
    const int d=-5;
    
    const int e=7;
    const int f=5;
    
    printf("%u+%u=%u\n",a,b,un_add(a,b));
    printf("%d+%d=%d\n",c,d,add(c,d));
    
    printf("%d-%d=%d\n",e,f,sub(e,f));
    printf("%d-%d=%d\n",f,e,sub(f,e));

    return 0;
}
    
unsigned un_add( unsigned a,unsigned b )
{
    unsigned c;
    
    do
    {
        c=(a&b)<<1;
        a^=b;       
    }while (b=c);
    
    return a;
}

int add( int a,int b )
{
    return ( int )un_add(( unsigned )a,( unsigned )b);
}

int sub( int a,int b )
{
    return add(a,-b);
}


再说一些小感受~有些时候,不懂的就算看了资料顶多就了解过大概……这个以前曾经花了很多时间去弄,但怎么也弄不出来,然后后来看了一下资料,按照资料方法弄了一遍,虽然能运行出来,但就是不知道资料在干些什么……然后某一天突然发现,原来自己不看资料也能像看到家一样熟悉~就是有种只可意会,不可言传的感觉~

[此贴子已经被作者于2018-5-14 22:41编辑过]

搜索更多相关主题的帖子: unsigned int sub const 资料 
2018-05-14 22:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
或者说说有没有可以讲解一下具体代码的意思的,感觉自己了解后说出来的不了解还是不了解~
如果有可以说出看法的或者我会跟进然后再详细补充一下~

[此贴子已经被作者于2018-5-14 22:36编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-14 22:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 吹水佬
其实我还有很多东西需要学习,这很有参考价值收藏了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-15 07:06
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 wmf2014
看了5楼的代码,的确那个比较容易理解,学习了~
那个"没有完全做位减法"这个意思是用-a=~a+1这种表达吧,也就是写成
return add(a,add(~b,1));这种形式的表达吧~

至于减法和加法数据类型前后不一致我注意到了,多谢提醒~

还有3楼那个int进行加法当两个负数相加时会出现溢出么?
当然从这个帖子中还是可以收获很多新东西非常感谢~


说个题外话,5楼那个代码其实就是用a^b后,进位再用^b来还原a
是挺巧妙的,其实再直接点while (b=(((a^=b)^b)&b)<<1);就可以了
其实就是模拟十进制的竖式加法,或者说十进制的竖式加法和二进制的竖式加法本来就是说同一个东西~


[此贴子已经被作者于2018-5-15 10:00编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-15 09:10
快速回复:用位运算实现简单的加减法~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016324 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved