高效bit 位经典操作

  1. 奇偶判断
    只需要判断数字的最后一个比特位是0 还是 1, 只要最后一位为0 都可以表示成 x*2 即 x<<1
    bool is_odd(int i){
    return i&1;
    }
  2. 交换两数
    a 和 b 进行交换 ,一般最常用的是
    c=a;
    a=b;
    b=c;
    又或者,不用第三个变量
    a=a+b;
    b=a-b;
    a=a-b;
    以上翻译成汇编语言可能生成的代码比较多,可以通过异或运算进行交换,依据的原理有两点 1) 一个数和自身异或为0 ; 2)一个数和0异或是自身。
    a=a^b
    b=a^b
    a=a^b
  1. 变换符号
    我们以前学习计算机基础的时候,都知道一个负的二进制数转换成十进制应该是多少,怎么计算? 对,就是对该二进制的bit 位 取反+1 。对于整数转换成负数也是如此。所以对于一个数取反应该就是
    ~a+1

  2. 取绝对值
    int i = a >> 31; //获取符号位
    int abs = (i == 0 ? a : (~a + 1)) ;// 如果i==0 代表是正数,直接返回即可,否则为-1取反。

我们知道一个数和-1 (0xFFFFFFFF)异或就是取反; 和0 异或就是自身, 所以上面求abs的时候可以表示为 (a ^ -1)+1 ; 而 i 不是0 就是-1 ,所以abs 赋值可以进一步优化为 ( a^i)-i 。
所以取反的步骤少了判断,即为 :
int i = a >> 31;
int abs=(a^i)-i;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,105评论 0 2
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 13,286评论 0 13
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 11,546评论 1 42
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 11,975评论 0 9
  • 知识点: 注:int类型默认32位有大小范围 且第一位为符号位 0 为正 1 为负 8.4作业 A:1、风力预警系...
    cGunsNRoses阅读 4,775评论 0 0

友情链接更多精彩内容