问一个小白的问题,c中的位移,不是很懂,求教一下。。。。。
左位移:<<格式:x<<要位移的位数
功能:把操作对象的二进制数向左移动指定的位,并在右边补上相应的0,高位溢出。
示例:x=01010011,y=x<<2,则y=10110000
注意:左移会引起数据的变化,左移以为相当于对原来的数值乘以2.
就是示例中看不懂,x左移两位不是应该等于01001100吗,怎么会变成10110000呢,还请论坛的神们帮忙理解下,谢谢
#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))); }