#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)));
}