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=?
结果:8&4=0
| 按位 或运算 两者位相同为0结果为0,否者为1
结果: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;
}