18.按位运算符

按位异或运算符^当两个操作数的对应位不同时将该位设置为1,否则,将该位设置为0。移位运算符<<与>>分别用于将运算的左操作数左移与右移,移动的位数则由右操作数指定。

为了进一步说明某些位运算符,我们来看函数getbits(x,p,n),它返回x中从右边数第p位开始向右数n位的字段。这里假定最右边的一位是第0位,n与p都是合理的正值。例如,getbits(x,4,3)返回x中第4、3、2三位的值。

/*  getbits函数:返回x中从第p位开始的n位  */
unsigned getbits(unsigned x, int p, int n)
{
	return (x >>(p+1-n))& ~(~0 << n);
} 

练习2-6 

#include
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
    return x & ~(~(~0 << n) << (p+1-n)) | (y & ~(~0 << n)) << (p+1-n);
}
 
 
int main()
{
    unsigned int x = 73;
    unsigned int y = 23;
    int p = 5;
    int n = 3;
    int r;
    r = setbits(x, p, n, y);
    printf("%d", r); //r的结果应为121
    return 0;
}

2-7

#include 
#include 
unsigned invert(unsigned x, int p, int n);
int main()
{
    int a, b;
    a=21;
    b=invert(a, 4, 3);
    printf("%d\n", b);
    system("pause");
    return 0;
}
unsigned invert(unsigned x, int p, int n)
{
    int a, b, c, d, e;
    a=(x>>(p+1))<<(p+1);
    b=x-a;
    c=b>>(p+1-n);
    d=c<<(p+1-n);
    e=(~c&~(~0<

2-8

unsigned rightrot(unsigned x, int n)
{
    int len = wordlength();
    unsigned rbits;
    if((n == n % len) > 0) {
        rbits = ~(~0 << n) & x;
        rbits = rbits << (len - n);
        x = x >> n;
        x = x | rbits;
    }
    return x;
}

你可能感兴趣的:(c语言)