位操作也可以用来求绝对值,对于负数可以通过对其取反后加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))
注意这种方法没用任何判断表达式,而且有些试题就要求这样做(^_^讲解过后应该是比较好记了)。
本站内容未经许可,禁止任何网站及个人进行转载。