C位运算

C位运算_第1张图片

1.shift+被红色区域选择的字符可以键入字符上面的符号,例如shift+6 就是“^”符号

2.二进制数系统中,位简记为b,也称为比特,每个二进制数字0或1就是一个位(bit)。位是数据存储的最小单位,其中8 bit 就称为一个字节(Byte)

C语言位运算符号有以下几个:

& 按位
| 按位 或
^ 按位 异或
~ 按位 取反
<< 按位 左移

>> 按位 右移

位运算就是以bit位计算

比如十进制8,转换二进制:0000 1000

比如十进制4,转换二进制:0000 0100

& 按位 与运算 两者位相同是1结果为1,否者为0

8:0000 1000

4:0000  0100

8&4=?

C位运算_第2张图片

结果:8&4=0

|  按位  或运算 两者位相同为0结果为0,否者为1

C位运算_第3张图片

结果:8|4=12

^ 按位  异或运算 不知道这样描述这个异或....,感觉看运算过程比较好理解

十    二进制

8 :0000 1000

4 :0000 0100

12:0000 1100

这个结果和 |或运算相同,咱们在多举例

8  :0000 1000

12 :0000 1100

4   :0000 0100

规律就是位相同为0,否则就是1

~ 按位取反,这个简单就是位是1就是0,0就是1

unsigned int a=0;

printf("%u",~a);        //打印C无符号最大的整数

十进制           二进制

0                 :00000000 00000000 00000000 00000000

4294967295 :1111111 1111111 1111111 1111111


<< 左移

8:0000 1000

8<<1 = 16    // 000 1000 0

8<<2 =32    // 00 1000 00

规律就是在低位加N个0就是结果,高位直接抛弃

>> 右

8:0000 1000

8>>1 = 4    // 0 0000 100

8>>2 = 2    // 00 0000 10

移有点特殊,在处理有符号数字的时候,符号位1,最高位是补0或是补1 取决于编译系统的规定。

测试环境:4字节int,VS2010

-1610612736:10100000 00000000 00000000 00000000

 -50331648   : 11111      10100000  00000000 00000000 000

-1610612736>>5= -50331648   


测试

#include "stdio.h"
#include "stdlib.h"
/*
&按位	与
|按位	或
^按位	异或
~按位	取反
<<按位	左移
>>按位	右移

源1	0000 1000	8
源2	0000 0100	4
&	0000 0000	0
|	0000 1100	4+8=12
^	0000 1100	12

    0000 1000
~	1111 0111	1+2+4+16+32+64+128=247

	 0000 1000	8
8<<2
结果:001000 00	32

	 0000 1000	8
8>>2
结果:000000 10	2


//测试结果代码
char n=8,n1=4;
unsigned char n2=8;
printf("%d %d %d %d %d\n",n&n1,n|n1,n^n1,n<<2,n>>2);
n2=~n2;
printf("%u",n2);
*/
void show_level(const char * user,int m,const int *level_list,int leng){
	int i,j,k=0;
	//int base=2;																	//2进制
	printf("%s(权限列表)",user);

	//十转任意进制算法
	j = m;
	while(j){
		j=j>>1;																		// j>>1 等价于 j/2
		k++;
	}
	for (i=k-1;i>=0;i--){
		j = 1<=1 && i<=8));													//判断输入的数字是否超过 level_list 最大的值
	m =m | level_list[i-1];														//加入权限
	return m;
}

int del_level(int m,int *level_list,int leng){
	int i,j,k;
	printf("输入删除的权限(1-%d):",leng);
	do{
		do{																		//获取一组数字
			fflush(stdin);														//清除读写缓冲区
		}while(scanf("%d",&i)!=1);
	}while(!(i>=1 && i<=8));													//判断输入的数字是否超过 level_list 最大的值
	m =m  & (~level_list[i-1]);													//删除权限
	return m;
}

int main(){
	int level_list[]={1,2,4,8,16,32,64,128};
	char user[20]="admin";														//默认用户名
	unsigned int m=0;															//权限位
	int select =-1;																//选择项

	do{
		system("cls");
		printf("1.查看权限\t2.加入权限\t3.删除权限\t4.-1退出\n");
		fflush(stdin);
		scanf("%d",&select);
		switch(select){
			case 1:
				show_level(user,m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//显示权限
				system("pause>nul");
				break;
			case 2:
				show_level(user,m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//显示权限
				m = add_level(m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//添加权限
				show_level(user,m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//显示权限
				system("pause>nul");
				break;
			case 3:
				show_level(user,m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//显示权限
				m = del_level(m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//删除权限
				show_level(user,m,level_list,sizeof(level_list)/sizeof(level_list[0]));			//显示权限
				system("pause>nul");
				break;
		}

	}while(select!=-1);

	return 0;
}


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