&,屏蔽码
|,设置
<<,>>左右移动
^, 两个数不同的设置为一
常用操作:因为初学,以后补充
简单函数练习:
#include <stdio.h>
unsigned invert(unsigned , int, int);
void pbin(unsigned x);
unsigned getbits(unsigned x, int p, int n);
unsigned setbits(unsigned x, int p, int n, unsigned y);
int main()
{
unsigned x = 79;
int p = 4, n = 4;
x = invert(x, p, n);
pbin(x);
return 0;
}
//将x从p位开始的n个数求反
unsigned invert(unsigned x, int p, int n)
{
unsigned i = 0;
i = getbits(x, p, n);
return setbits(x, p, n, ~i);
}
//打印二进制
void pbin(unsigned x)
{
if(x) pbin(x/2);
else return;
printf("%d",x%2);
}
//将x中从第p位开始的位设置为y中最右边n位的值
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return ((y & ~(~0<<n))<<(p+1-n)) | (x & ((~0<<(p+1)) | (~(~0<<(p+1-n)))));
}
//得到第p位开始的n位(x, 4, 3)得到4,3,2位
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p + 1 - n)) & ~(~0 << n);
}
//右移的从左边冒出来unsigned rightrot(unsigned x, int p)
{
unsigned j = 0; for(; p; p--)
{
j = x & ~(~0 << 1);
x = x >> 1;
x = setbits(x, 31, 1, j);
}
return x;
}
题目来自:《c程序设计语言》