计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
正数的原码,反码,补码都是相同的;负数原码转化为反码:符号位不变,数值位按位取反;负数原码转化为补码:符号位不变,数值位按位取反,末尾加一。
但是python不像C语言有无符号类型,python中一个整数x按位取反后,最高位的符号位:正负交换了,即正数变为负数,负数变为正数了。要实现单纯的按位取反,而不带符号,
可以通过与一个全1的数据按位异或实现。比如,你有一个16位的数据a,需要对它做按位取反,那么这样就行了:a ^= 0xffff
比如将如下C++ 算法用python替代:
C++ 代码:
1 UINT8 check_sum(UINT8 *buf, UINT8 bufLen) 2 { 3 UINT8 ucCrc = 0; 4 UINT8 i; 5 for (i=0; i<bufLen; i++) 6 { 7 ucCrc += buf[i]; 8 } 9 ucCrc = ~ucCrc; 10 ucCrc += 1; 11 return ucCrc; 12 }
python代码:
1 def check_sum(data): 2 usCRC = 0 3 for byte in data: 4 usCrc += ord(byte) 5 #usCrc = ~usCrc #此处不能跟C++一样使用按位取反运算 6 usCrc ^= 0xff 7 usCrc += 1 8 return '%02X'%usCrc