问一个小白的问题,c中的位移,不是很懂,求教一下。。。。。
左位移:<<格式:x<<要位移的位数
功能:把操作对象的二进制数向左移动指定的位,并在右边补上相应的0,高位溢出。
示例:x=01010011,y=x<<2,则y=10110000
注意:左移会引起数据的变化,左移以为相当于对原来的数值乘以2.
就是示例中看不懂,x左移两位不是应该等于01001100吗,怎么会变成10110000呢,还请论坛的神们帮忙理解下,谢谢
2014-01-07 17:31
2014-01-07 22:39
程序代码:#include "stdio.h"
main()
{
// 下面是两种题目
unsigned x = 91; // 01011011 二进制
int p=5,n=2,y=32; // result 107
printf("%d\n", x & ~(~(~0<<n) << (p+1-n))); //把x第p位开始往右n个字符清0,其余不变
printf("%d\n", y & ~(~0<<n) << (p+1-n)); //把y中除最右边的n位意外的其他位都清零,并左移到第p位处
//--------------------------------- ~为取反,二进制位的0全变为1,1全变为0----------------------------------------------
printf("%d\n", ~0<<n ); //把一个所有位都为1的屏蔽码左移n位(右边将多出n个0位)
printf("%d\n", ~(~0<<n) ); //把屏蔽码n位全设置为1,其余位0
printf("%d\n", ~(~0<<n) << (p+1-n) ); //把屏蔽码为1的位左移到p处
printf("%d\n", ~(~(~0<<n) << (p+1-n))); //把屏蔽码的n位全设置为0,其余位全为1
printf("%d\n", x & ~(~0<<n) << (p+1-n) ); //将x的第p位往右数n位的字段清0
printf("%d\n", x & ~(~(~0<<n) << (p+1-n)) | (y & ~(~0<<n) << (p+1-n)));
}

2014-01-08 08:58
2014-01-08 09:00
2014-01-08 09:36
2014-01-14 10:59
2014-10-29 16:35