博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用位运算求一个数的绝对值
阅读量:7126 次
发布时间:2019-06-28

本文共 751 字,大约阅读时间需要 2 分钟。

     我们知道在我们对一个数进行位运算的时候,是在这个数的补码上进行的,对于补码我们知道,正数的补码是原码,负数的补码为原码除了最高位的符号位,取反,然后加1。把补码转换成原码的时候,正数还是原码,负数时把补码除了符号位取反然后加1(我们可以发现如果这时候连符号位也求反,然后加1,与以前不同的只是少了一个符号位,现在实际上就是这个数的绝对值)。所以我们可以得到对一个负数求绝对值的表达式为

  1. int SignReversal(int a)  
  2. {  
  3.     return ~a + 1;  
  4. }

那么由这些知识我们可以很快地得到求一个数的绝对值的表达式:

先移位来取符号位,int i = a >> 31;要注意如果a为正数,i等于0,为负数,i等于-1。然后对i进行判断——如果i等于0,直接返回。否之,返回~a+1。完整代码如下:

 

[cpp] 
 
  1. //by MoreWindows( http://blog.csdn.net/MoreWindows )  
  2. int my_abs(int a)  
  3. {  
  4.     int i = a >> 31;  
  5.     return i == 0 ? a : (~a + 1);  
  6. }  

 

现在再分析下。对于任何数,与0异或都会保持不变,与-1即0xFFFFFFFF异或就相当于取反。因此,a与i异或后再减i(因为i为0或-1,所以减i即是要么加0要么加1)也可以得到绝对值。所以可以对上面代码优化下:

 

[cpp] 
 
  1. //by MoreWindows( http://blog.csdn.net/MoreWindows )  
  2. int my_abs(int a)  
  3. {  
  4.     int i = a >> 31;  
  5.     return ((a ^ i) - i);  
  6. }  

而且有些笔面试题就要求这样做(比如不让用if语句的时候),因此建议读者记住该方法

 

你可能感兴趣的文章
Linux逻辑卷快照及ssm的使用
查看>>
关于工资的三个秘密
查看>>
NFS服务器配置
查看>>
APUE读书笔记-05标准输入输出库(2)
查看>>
mysql中replace into、replace into、insert ignore用法区别
查看>>
Sql Server系列:数据库组成及系统数据库
查看>>
***之open***
查看>>
tengine+uwsgi+django
查看>>
Django 模板语法取值
查看>>
oracle和sql server 比较
查看>>
高端存储亟待国产化
查看>>
DHCP分配租期问题的重要性
查看>>
linux负载均衡
查看>>
NATIVE SQL的用法
查看>>
JS多项选择删除
查看>>
scrollLeft、offsetLeft、clientLeft、clientHeight详解
查看>>
SQL 到 NOSQL 的思维转变
查看>>
Let's Encrypt,免费好用的 HTTPS 证书
查看>>
for
查看>>
Centos搭建nginx环境,编译,添加服务,开机启动。
查看>>