sillion 2020-05-03
void main(void){
unsigned int d=0;
char c[10]="居中",y;
/*
类型 0~7
大小 8~15
对齐方式 16~17
粗体 18
斜体 19
下划线 20
*/
unsigned int x;
do{
printf("类型 大小 对齐方式 粗体 斜体 下划线\n");
printf("%4d%4d%8s%6s%6s%6s\n",d&0xff,(d>>8)&0xff,c,(d>>18)&0x1?"on":"off",(d>>19)&0x1?"on":"off",(d>>20)&0x1?"on":"off");
printf("a:更改字体类型\nb:更改字体大小\nc:更改对齐方式\nd:设置粗体\ne:设置斜体\nf:设置下划线\nq:退出\n");
//地址右移并与所占空间的最大值做逻辑与运算保留其所在地址的值同时清除其他位置上的值以显示具体的数据
setbuf(stdin,NULL);//清空缓冲区
y=getchar();
setbuf(stdin,NULL);//清空缓冲区
switch (y) {
case ‘a‘:printf("请输入你要改变的字体类型(0~255):\n");
scanf("%d",&x);
d&=~0xff;//将目标地址数据清空,保留其他地址数据
d|=x;//将输入的数据与目标地址按位或以写入
break;
case ‘b‘:printf("请输入你要改变的大小(0~255)\n");
scanf("%d",&x);
d&=~(0xff<<8); //地址左移8位跳过字体类型所占地址
d|=(x<<8);//将输入的数据也左移8位到目标地址并写入
break;
case ‘c‘:printf("请输入你要如何对齐(1:左|2:右|0:居中\n");
scanf("%d",&x);
d&=~(0x03<<16);//跳过其他类型地址,该地址占2位即011=0x03
d|=(x<<16);//左移16位写入
break;
case ‘d‘:printf("是否粗体(1:0):\n");
scanf("%d",&x);
d&=~(0x1<<18);//跳过其他类型地址,该地址占1位即01=0x01
d|=x<<18;
break;
case ‘e‘:printf("是否斜体(1:0):\n");
scanf("%d",&x);
d&=~(0x1<<19);//跳过其他类型地址,该地址占1位即01=0x01
d|=x<<19;
break;
case ‘f‘:printf("是否下划线(1:0):\n");
scanf("%d",&x);//跳过其他类型地址,该地址占1位即01=0x01
d&=~(0x1<<20);
d|=x<<20;
break;
}
if(((d>>16)&0x03)==0)//如果目标地址上的数据==0
strcpy(c,"居中");//修改字符串数据
else if(((d>>16)&0x03)==1)
strcpy(c,"左对齐");
else if(((d>>16)&0x03)==2)
strcpy(c,"右对齐");
printf("对齐数据:%d\n",(d>>16)&0x03);
}while(y!=‘q‘);
}按位操作六大运算符:
^: 1001 ^ 0110 =1111;两值进行异或操作,当且仅当对应的位仅有一位为真时为真;1100 ^0110 =1010
|: 1001 | 0110 =1111; 两值进行或操作,只要任意一方为真即为真;1000 | 0111=1111
&: 1001& 0110=0000; 两值进行与操作,当且仅当双方皆为真时为真; 1001 & 0101=0001=1
~: ~1001 =0110 ; 单目运算符,对值进行取反操作,1010=0101=101
<<:1001<<N; 将目标地址左移N位,左边多余的值丢弃,其右边空余的值补0; 具体的实现看系统
>>:1001>>N; 将目标地址右移N位,右边多余的值丢弃,其左边空余的值补0; 具体的实现看系统