首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 不用判断语句,能否有方法把正负数快速的转化为+1和-1 [已结贴,结贴人:bottlebox]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 18:42:15 楼主
    如题,有没有什么高效的方法?
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 18:54:071楼 得分:0
    int num=10;//-10
    int r = (num&0x80000000)+0x01;

    //负数最高位=1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 18:55:152楼 得分:0
    错了
    int r = (num&0x80000000) ¦0x80000001;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 19:06:153楼 得分:0
    int r = ((num&0x80000000)+0x01) ¦(num&0x80000000);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 19:07:364楼 得分:0
    C/C++ code
    int num=10;//-10 int r = (num&0x80000000); r=(r+0x01)|r;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 19:09:455楼 得分:0
    引用 2 楼 artman 的回复:

    int r = (num&0x80000000) ¦0x80000001;

    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 19:22:126楼 得分:0
    C/C++ code
    #define TOSIGNEDONE(n) ((*((unsigned char*)(&n) + sizeof(n) - 1)>>7 == 0x01) ? -1 : 1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 19:28:017楼 得分:0
    引用 6 楼 xkyx_cn 的回复:
    C/C++ code
    #define TOSIGNEDONE(n) ((*((unsigned char*)(&n) + sizeof(n) - 1)>>7 == 0x01) ? -1 : 1)
      不是不让用判断语句么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 19:48:378楼 得分:0
    引用 5 楼 lixun_21 的回复:
    引用 2 楼 artman 的回复:

    int r = (num&0x80000000) ¦0x80000001;

    up

    不错,多谢。
    不过这样子会把0改变了,有没有更好的方法?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 20:24:509楼 得分:0
    试了一下,上面的方式不对,-1的表示是0xFFFFFFFF
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 20:47:5910楼 得分:0
    4楼正确
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 20:55:1911楼 得分:0
    4楼也是不对的,和5楼原因相同
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 21:05:0912楼 得分:0
    是的不对,那只有笨法了.
    int ff[2]={1,-1};
    r=ff[(num&0x80000000)>>31];
    应该也算判断,不过还是没解决0的问题!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    发表于:2008-07-04 21:05:5713楼 得分:15
    int r;
    int rr = 1- ((r&0x80000000) >>30)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    发表于:2008-07-04 21:07:3614楼 得分:0
    题目:能否有方法把正负数快速的转化为+1和-1 

    0不属于你的正负数范畴
    要考虑的话,只能另外判断
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 21:08:2115楼 得分:0
    引用 13 楼 k2eats 的回复:
    int r;
    int rr = 1- ((r&0x80000000) >>30)

    妙!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 21:46:2116楼 得分:0
    引用 13 楼 k2eats 的回复:
    int r;
    int rr = 1- ((r&0x80000000) >>30)

    确实妙,又想了一下,0的问题还是可以解决,不过感觉可能会受到硬件的影响。
    int result;
    int a[3]={20,-10,0};
    for(int i=0;i <3;i++){
    result= -((a[i]&0x80000000) >>30)-(((a[i]&0x7fffffff)+0x7fffffff)>>31) ;
        cout < <result < <"\t";
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 21:59:0417楼 得分:0
    循环中还是有判断的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 22:26:3818楼 得分:0
    循环和求值无关,只是为显示多个测试结果。
    测试了下速度大概可以比if语句快1.5倍左右。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 23:20:3219楼 得分:0
    仔细想了一下, -((a[i]&0x80000000) >>30)-(((a[i]&0x7fffffff)+0x7fffffff)>>31) 还是不行。
    对0x80000000的值会出错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 23:46:2220楼 得分:0
    这样OK了!
    int f = 1-((!num)+((num&0x80000000) >>30));
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-04 23:50:5621楼 得分:15
    int f = 1-((!num)+((num&0x80000000) >>30));
    !num逻辑运算符
    当num =0 !num =1,((num&0x80000000) >>30)=0, ==> 0;
    当num >0 !num =0, ((num&0x80000000) >>30)=0, ==> 1;
    当num <0 !num =0, ((num&0x80000000) >>30)=2, ==> -1;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 12:44:5322楼 得分:0
    试了下,效率不错,也接近1.5倍,多谢了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-05 15:45:1723楼 得分:0
    ding
    ding
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-07 10:32:4824楼 得分:0
    引用 23 楼 qinqinhao 的回复:
    ding
    ding
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-07 14:23:4425楼 得分:0
    发现还可以稍微简化一下:((bool)x)-((x&0x80000000)>>30)
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved