中国象棋将帅问题; 伟大的位运算; 终于开窍了。。。

来源:互联网 发布:淘宝上的内衣模特 编辑:程序博客网 时间:2024/06/10 01:28

 

 

由于想存储两个大于1小于9 的整数,1-9的范围很小,用4位存储一个大于1小于9的数,由于4位共有24个数,即能表示0-15这些整数,足够存储1-9,所以我们用两个4位,即8位存储2个1-9的整数,高4位存储一个,低4位存储一个。 由于要避免最高位符号位的影响,必须用unsigned 型变量, 否则移位操作就不是逻辑移位补0,而是补符号位,这样就不和谐了. 由于我们只要8位无符号变量,所以用unsigned char,正好是8位,足够用了.

 

例如: 0011 0100  , 高4位表示整数 3,低4位表示整数4.     用位来记录整数就是这么个含义...

那么怎么分别取出两个整数,怎么设置两个整数呢?

 

就是通过位运算符^,&,|,~  ,这些位操作符进行运算.   具体到这里怎么办呢?

 

1.我们想取高位的整数3 , 取的意思是把高4位移到一个8位变量的低4位,并让高4位为0,这样直接打印这个8位变量就是整数3了.

看上边的例子:  我们想取0011(等于3), 那么就是把0011 0100 这个二进制串向右移位4次,得到 0000  0011, 这时候打印整个

二进制串就显示了3,是我们想要的整数..

 

2.我们想设置高位的整数为8,设置的意思就是把0011 0100 的高4位改成表示8的二进制数,而低4位仍为原来表示4的二进制数。

所以,可以先把0011 0100 的高4位全变成0 ,这个操作可以让0011 0100 & 0000 1111= 0000 0100,

然后把整数8的二进制串0000 1000 << 4 ,变成了1000 0000, 然后1000 0000 | 0000 0100= 1000 0100。

 

现在1000 0100高4位表示8, 低4位还是原来的4.   已经完成了修改.  如果我们现在想取高4位的数是多少,又可以照第1部做,再说一遍:

1000 0100 >> 4 = 0000 1000,现在0000 1000就是表示8的一个整数了.

 

当然,想打印高4位表示的数字8,必须(int)强制转换,否则系统按照unsigned char ,即字符打印,而不是我们想要的数字8.。。

 

unsigned char num=8;        -->二进制  :  0000 1000

unsinged char num1=5;        --->二进制: 0000 0101

 

num&num1= 0;    --->二进制:  0000  0000

num<<4=128.  二进制: 1000 0000

 

即,数字的位运算是对应于二进制的......不要认为二进制运算就一定要写出0000111111这些东西来运算..