第一题:
如果书本上真是那个意思,那就是它的错误。
这个程序关键的是这几行代码:
b=a>>3;
//你写的是4,估计是抄错了,应该是3,代表向右移3位。这样从右数第4位就变成了右数第一位了
c=~(~0<<4);
//这个才是关键,~0表示各个位都是1,再向左移4位,此时低4位是0,其他位是1,再
取反
以后,c的二进制数低4位是1,其他位是0
d=b&c;
//b和c按位与,因为c的低4位是1,其他位是0,1&任何数=任何数,0&任何数=0.所以取到的就是b的低4位了。
也就是a的4-7位。
如果按照书本上归纳:从右面开始取m—n位,代码如下:
b=a>>(m-1);
c=~(~0<<(n-m));
d=b&c;
第二题:
这个程序的功能其实就是将一个数的二进制位中的低n位,移动到它的高n位,相应的,原来的高16-n位也就变成了低16-n位了。这个就是它所谓的“循环移位”。
举个例子:
a的二进制数:0110
1100
0011
1010
取n为4,则
b=a<<12;
//b=1010
0000
0000
0000
只保留了a的低4位
c=a>>4;
//c=0000
0110
1100
0011
低4位丢失,高4位补0
c=c|b;
//此时
按位或
,c=1010
0110
1100
0011
实现了低4变成了高4位
明白了吧?
举例说明
补码
和
反码
:
反码好理解,就是取反,比如0110的反码是1001.
补码要分类。正数的补码就是他的
原码
。负数的补码遵循规则"绝对值按位取反再+1"
下面举例子:
8的补码:
8的原码:0000
1000。补码仍然是0000
1000
-8的补码:因为是负数,最高位为1,需要保留。而-8的绝对值如上,合在一起就是1000
1000.先按位取反:1111
0111,再+1:
1111
1000。这个就是-8的补码了。