整数与二进制

软件开发中,整数主要分为有符号整数和无符号整数,其中,有符号整数可以处理0、正整数和负整数,无符号整数用于处理0和正整数,下面分别讨论。

无符号整数

无符号整数的二进制表示中不需要处理符号位,相对而言,处理起来比较简单,下面了解无符号整数中,十进制与二进制之间的转换方法。

首先是将十进制整数转换为二进制数据,以整数39为例,使用39除以2,余数得1,商为19;再用商除2,余数得1,商得9;以此类推,直到商为1;从最后的商开始,反向写出计算过程中的余数,就得到整数的二进制数据。整个计算过程如下图。

最终,整数39的二进制表示就是100111。

不同的环境中,还可以分别处理8位、16位、32位和64位等类型的整数,如C#中的byte类型就用于处理8位无符号整数,其取值范围为0到255;如果使用二进制表示byte类型的39,则需要在高位补0,即00100111。

将无符号整数的二进制转换为十进制时,需要通过2n-1计算出每个数位为1的值,然后相加得出最终结果,其中n为从右向左数的第几位。

还以二进制数00100111为例,将其转换为十进制时,可以使用如下算式:

二进制转换为十进制
25+22+21+20=32+4+2+1=39

二进制补码

二进制的补码是指原码按位取反(0变1,1变0)后加1的编码。以100111为例,求它的补码时,首先按位取反得011000,再加1得011001。

有符号整数

有符号整数的二进制形式,最高位(左数第一位)为符号位,0表示0或正整数,1表示负整数;这样,当0或正整数时,其二进制形式与无符号整数相同,需要注意的是负整数的形式,除了最高位为1,其它位是数值绝对值的补码形式。

比如,C#中的sbyte类型表示8位有符号整数,11011001中的最高位为符号位,1011001表示数据绝对值的补码,减1得到1011000,再按位取反得到0100111,通过计算求出各数位的数据和是39,也就是说,11011001表示的有符号整数就是-39。

位逻辑运算

位逻辑运算包括:

  • 按位取反运算,即0变1,1变0。很多编程语言中使用~运算符,如~0011等于1100。
  • 位与运算,两个数位都是1时结果为1,否则结果为0。很多编程语言中使用&运算符,如1011&1100等于1000。
  • 位或运算,两个数位有一个为1时结果为1,两个数位都为0时结果为0。很多编程语言中使用|运算符,如1011|1100等于1111。
  • 异或运算,两个数位数据不同时结果为1,数据相同时结果为0。很多编程语言中使用^运算符,如1011^1100等于0111。

位移运算

位移运算包含位左移运算和位右移运算。

左移运算时,二进制位向左(高位)移动,无符号整数时,数位整体左移,数据的低位补0;有符号整数时,符号位不变,数据位左移,低位补0。大多编程语言使用<<运算符执行左移运算,如x<<3其实际执行的就是x*23的运算,即2<<3的结果为16。

右移动运算时,二进制位向右(低位)移动,无符号整数右移运算时,数位整体右移,高位补0;有符号整数右移运算时,符号位不变,移动的数位用符号位数据填充。大多数编程语言中使用>>运算符,如x>>3执行的就是x÷23的运算,即64>>3结果为8。

代码中的整数类型

不同编程语言或平台对于整数的支持也会有所不同,比如,Java中就没有无符号整数类型,但处理较大的整数时可以使用BigInteger类。

学习一种编程语言时,应注意它对数据类型的支持情况,并合理应用。