计算机中的数字
在C/C++中有以下几种基本数字类型:double,float,int,bool;以及long,unsigned,short等可以用来修饰其中一种或者几种的类型修饰词。另外地,char基本类型在内存中也是以数字形式存储的,是占一个字节的ASCII码。通常默认设置下打印出来的结果是十进制的形式,然而在计算机底层存储的则是以二进制的形式。从加减乘除等运算来看,进制对结果并没有实质影响,只是表现形式有差异。计算机中的位运算是基于二进制的整型进行的,然而返回的结果却可能是十进制或者其他形式。
几种类型的具体存储形式:(一个字节对应8位)
char 一个字节
int 四个字节
float 四个字节
double 八个字节
另外三种修饰词表示:
short 一半的位数
long 一倍的位数
signed & unsigned 不改变位数,无符号类型存储的值上限会翻倍因为第一位的符号位被用来记录数据
一个字在不同的处理器中定义是不一样的:根据系统的位数可以是32位或者64位,嵌入式之类的原始处理器可能也会是16位或者更低。
32位系统下:1word=32bits=4bytes
64位系统下:1word=64bits=8bytes
运算法则
与操作:& AND 两者中都为1则为1;
或操作:| OR 两者中有一个为1则为1;
异或操作:^ XOR 或操作取反;
取反操作:~ NOT 单目运算符,取反的操作;
左移操作:<< 将二进制数往左移对应的位数,并补零;
右移操作:>> 将二进制数往右移对应的位数,最左边如何处理看编译规则。
下面给出一些运算实例:
unsigned int a = 60; // 60 = 0011 1100
unsigned int b = 13; // 13 = 0000 1101
int c = 0;
c = a & b; // 12 = 0000 1100
c = a | b; // 61 = 0011 1101
c = a ^ b; // 49 = 0011 0001
c = ~a; // -61 = 1100 0011
c = a << 2; // 240 = 1111 0000
c = a >> 2; // 15 = 0000 1111
特别地,位当中的或/与运算和逻辑当中的或与运算不一样:逻辑中为&&和||,位当中为&和|,各自针对的类型也不一样。
位运算有关的算法
1)交换变量的值:原理为位运算的逆运算为自身,三次运算中只出现三个不同的值。
x = x ^ y;
y = x ^ y;
x = x ^ y;
2)记录每个位置的情况:对于N个开关,左移N位记录他的通断情况。