位操作也可以用来求绝对值,对于负数可以通过对其取反后加1来得到正数。对-6可以这样:11111010(二进制)–取反->00000101(二进制)-加1->00000110(二进制)来得到6。  

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

i#!/usr/bin/python

# -*- coding: UTF-8 -*-

def intmy_abs(a):

   i = a >> 31

   res = a if i == 0 else ~a + 1

   return res

print(intmy_abs(-11))

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

#!/usr/bin/python

# -*- coding: UTF-8 -*-

def intmy_abs(a):

   i = a >> 31

   return ((a^i)-i);

print(intmy_abs(-11))  

注意这种方法没用任何判断表达式,而且有些试题就要求这样做(^_^讲解过后应该是比较好记了)。

本站内容未经许可,禁止任何网站及个人进行转载。

   口袋儿题库-青少儿编程自测题库