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