python中的取反操作
在python中取反操作符~是对数字的二进制位进行取反,然后返回取反结果对应的十进制数字。这个可以参考:Python3运算符
使用案例如下:
num = 60
# 查看二进制
print(num, bin(num)) # 60 0b111100
num_ = ~num # -(x + 1)
print(num_, bin(num_)) # -61 -0b111101
细心的会发现,经过~处理后的结果并不是对应位置为相反关系。这就需要了解计算机是如何存储负数的了,负数通常是用其补码表示,正数的补码是其本身。假如这个整数是有符号8位(最高位是符号位,0表示正,1表示负)的,那么其对应的表示是:0011 1100,取反之后是:1100 0011,其是一个负数的补码。
那么如何将负数的补码转成十进制呢?
- 把补码“取反”,则有:0011 11 00 (又回来了)
- 把取反后的结果加1,则有0011 11 01
- 将2中的表示整数加上负号的结果就是这个补码实际的十进制数字了。
不难计算出上面的结果就是-61了。这也是为什么~的做相当于 - (x + 1)了。python中则是将负号单独拿出来,后面就是对应整数的二进制了,即61的二进制就是0011 1101.
除此之外,python中的True是数字1,False是数字0. 事例如下:
print(0 == False, 1 == True) # True True
print(~0, ~True) # -1 -2
取反运算符应用到pytorch中
bool类型的数字和非布尔类型的使用如下:
tensor_a = torch.tensor([True])
tensor_a_ = ~tensor_a
print(tensor_a) # tensor([True])
print(tensor_a_) # tensor([False])
tensor_b = torch.tensor([60])
tensor_b_ = ~ tensor_b
print(tensor_b) # tensor([60])
print(tensor_b_) # tensor([-61])
可以看出,在pytorch中对于bool类型的取反就是对True或False进行取反,这是与python中bool数据类型操作有所不同。