计算机位操作:int abs( int x ) { int y ; y = x > > 31 ; return (x^y

问题描述:

计算机位操作:int abs( int x ) { int y ; y = x > > 31 ; return (x^y)-y ;//or:(x+y)^y }
求绝对值的位操作技巧,return的式子看不懂,原理是怎样的呢?
1个回答 分类:综合 2014-12-06

问题解答:

我来补答
一、先补充说明几个基础概念
1、现有的微机基本上都是32位操作系统,在此操作系统中,整数为32位;
2、右移运算为按位往右移的操作,右移1位时最右边的位被丢弃,最高位保持原值不变,其他位都被其左边一位所替换,32位的整数右移31位,即是保留其最高位符号位,即正数得0,负数得-1.如:整数7,其二进制为:0000 0000 0000 0111,右移1位则为:0000 0000 0000 0011,得值为3;
3、关于负数的二进制表示,计算机中负数存储时,不是简单的将符号位置为1,而是采用补码的形式存储的:负数最高位为符号位,也就是1,其余全部取反,然后再加1.
如-7的二进制存储不是:1000 0000 0000 0111,而是:1111 1111 1111 1000+1即1111 1111 1111 1001
4、异或运算^,即两个数按位进行异或,当两个数中相同位相同时结果值对应位为0,否则为1,如3^7,表示为:0011 ^ 0111,则异或后值为:0100 等于4
二、有了以上基础概念,我们再来分析你的程序
针对以上代码分析如下:
1、 y = x > > 31 ;//右移31位,只保留符号位,如果是负数,则是-1,其二进制为1111 1111 1111 1111,全为1,如果是正数,则全0
2、x^y//X与Y的异或运算,按位进行异或,当y=0时,实际上二者异或后运算的值保持不变,当Y=-1时,则实际上是将原值每位求反(1变成0,0变成1)
3、-y//当y为0时保持不变,为-1时,则表示加1,因此
(x^y)-y当Y=0时,表示保持x不变,当y=-1时,则表示将x各位求反后加1,实际上就是对该数求负,由于原来就是负数,因此就是变成正数.
综上所述,该过程就是求绝对值.
 
 
展开全文阅读
剩余:2000