编写一个函数,把二进制字符串转换为一个数值,例如,有下面的语句:
char *pbin="01001001";
那么把pbin作为参数传递给该函数后,它应该返回一个int类型的值73
#include<stdio.h>
#include<math.h>
int str2bin(const char *s,int len){
int sum=0;
int base = 1;
for(int i=len-1;i>=0;--i){
sum += base * (s[i]-'0');
base*=2;
}
return sum;
}
int main(void){
printf("%d\n", str2bin("01001001",8));
return 0;
}
编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二进制数使用~运算符、&运算符、|运算符和^运算符,并以二进制字符串形式打印结果(如果无法使用命令行环境,可以通过交互式让程序读取字符串)。
#include<stdio.h>
#include<math.h>
unsigned int str2bin(const char *s,int len){
int sum=0;
int base = 1;
for(int i=len-1;i>=0;--i){
sum += base * (s[i]-'0');
base*=2;
}
return sum;
}
void dec2bin(char *s,unsigned int n){
int len=0;
char c;
if(n==0)s[len++] = '0';
while(n){
s[len++] = (n&1)+'0';
n >>=1;
}
s[len] = '\0';
for(int i=0,j=len-1;i<j;++i,--j){
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
int main(int argc, char** argv){
char s[10];
dec2bin(s, str2bin(argv[1],8)&str2bin(argv[2],8));
printf("%s & %s = %s\n", argv[1],argv[2],s);
dec2bin(s, str2bin(argv[1],8)|str2bin(argv[2],8));
printf("%s | %s = %s\n", argv[1],argv[2],s);
dec2bin(s, str2bin(argv[1],8)^str2bin(argv[2],8));
printf("%s ^ %s = %s\n", argv[1],argv[2],s);
dec2bin(s, ~str2bin(argv[1],8));
printf("~%s = %s\n", argv[1],s);
return 0;
}
编写一个函数,接受一个int类型,并返回该参数中打开位的数据量,在一个程序中测试该函数。
#include<stdio.h>
#include<math.h>
unsigned int open_bit(int num){
int sum=0;
int base = 1;
while(num){
sum+= num&1;
num>>=1;
}
return sum;
}
int main(int argc, char** argv){
printf("%d 打开位数 %u\n", 64, open_bit(64));
return 0;
}
编写一个程序,接受两个int类型的参数:一个是值,一个是位的位置。如果指定2位的位置为1,该函数返回1,否则返回0。在一个程序中测试该函数。
#include<stdio.h>
#include<math.h>
unsigned int open_bit(int num,int loc){
return (num&(1<<(loc-1)))>0?1:0;
}
int main(int argc, char** argv){
printf("%d 位置为 %u\n", 64, open_bit(15, 6));
return 0;
}
编写一个函数,把一个unsigned int 类型值中的所有位向左旋转指定数据的位,例如,rotate_1(x,4),把x中所有位向左移动4个位置,而且从最左端移出的位会重新出现在右端,也就说,把高阶位移出的位让如低阶位。在一个程序中测试该函数。
#include<stdio.h>
#include<math.h>
unsigned int open_bit(int num,int loc){
return (num<<loc)|(num>>(32-loc));
}
int main(int argc, char** argv){
printf("%d 位置为 %u\n", 11, open_bit(11, 4));
return 0;
}
设计一个位字段结构以存储下面的信息。
字体ID:0~255之间的一个数;
字体大小:0~127之间的一个数;
对齐:0~2之间的一个数,表示左对齐,居中,右对齐
加粗:开1闭0
斜体:开1闭0
下划线:开1闭0
在一个程序中使用结构来打印字体参数,并使用循环菜单来让用户改变参数,例如,该程序的一个运行示例如下。
ID SIZE ALIGENMENT B I U
1 12 left off off off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline
q)quit
s
Enter font size (0~127):36
ID SIZE ALIGENMENT B I U
1 36 left off off off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline
q)quit
a
select alignment:
l)left c)center r)right
ID SIZE ALIGENMENT B I U
1 36 right off off off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline
q)quit
i
ID SIZE ALIGENMENT B I U
1 36 right off on off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline
q)quit
q
Bye
#include<stdio.h>
#include<stdlib.h>
struct font{
unsigned int id:8;
unsigned int size:7;
unsigned int align:2;
unsigned int b:1;
unsigned int i:1;
unsigned int u:1;
};
void display(const struct font *f){
char *key[2]={"off", "on"};
char *ali[3] = {"left","center","right"};
printf("ID\tSIZE\tALIGENMENT\tB\tI\tU\n");
printf("%d\t%d\t%s\t\t%s\t%s\t%s\n",f->id,f->size,ali[f->align],key[f->b],key[f->i],key[f->u]);
printf("f) change font\t s)change size\t a)chang alignment\n");
printf("b) toggle bold \ti)toggle italic \tu)toggle underline \n");
printf("q)quit\n");
}
void change_font(struct font *f){
int num;
printf("Enter font id (0~255):");
scanf("%d", &num);
f->id=num;
while(getchar()!='\n');
}
void change_size(struct font *f){
int num;
printf("Enter font size (0~255):");
scanf("%d", &num);
f->size=num;
while(getchar()!='\n');
}
void change_ali(struct font *f){
printf("select alignment:\n");
printf("l)left \tc)center \tr)right\n");
char c=getchar();
switch(c){
case 'l':f->align = 0;break;
case 'c':f->align = 1;break;
case 'r':f->align = 2;break;
default:f->align = 0;break;
}
while(getchar()!='\n');
}
int main(int argc, char** argv){
struct font f={0};
char c;
display(&f);
while((c=getchar())!='\n'){
while(getchar()!='\n');
switch(c){
case 'f':change_font(&f);break;
case 's':change_size(&f);break;
case 'a':change_ali(&f);break;
case 'b':f.b=1;break;
case 'i':f.i=1;break;
case 'u':f.u=1;;break;
case 'q':printf("Bye");exit(EXIT_SUCCESS);
}
display(&f);
}
return 0;
}
编写一个与编程练习6功能相同的程序,使用unsigned long 类型的变量储存字体信息,并且使用按位运算符而不是位成员来管理这些信息
#include<stdio.h>
#include<stdlib.h>
struct font{
unsigned int id:8;
unsigned int size:7;
unsigned int align:2;
unsigned int b:1;
unsigned int i:1;
unsigned int u:1;
};
void display(unsigned long f){
char *key[2]={"off", "on"};
char *ali[3] = {"left","center","right"};
printf("ID\tSIZE\tALIGENMENT\tB\tI\tU\n");
printf("%d\t%d\t%s\t\t%s\t%s\t%s\n",(f>>12)&255,(f>>5)&127,ali[(f&(3<<3))>>3],key[(f&4)>>2],key[(f&2)>>1],key[f&1]);
printf("f) change font\t s)change size\t a)chang alignment\n");
printf("b) toggle bold \ti)toggle italic \tu)toggle underline \n");
printf("q)quit\n");
}
void change_font(unsigned long *f){
int num;
printf("Enter font id (0~255):");
scanf("%d", &num);
*f = (*f&(~(255<<12)))|(num<<12);
while(getchar()!='\n');
}
void change_size(unsigned long *f){
int num;
printf("Enter font size (0~255):");
scanf("%d", &num);
*f = (*f&(~(127<<5))) |(num<<5);
while(getchar()!='\n');
}
void change_ali(unsigned long *f){
printf("select alignment:\n");
printf("l)left \tc)center \tr)right\n");
char c=getchar();
int num;
switch(c){
case 'l':num = 0;break;
case 'c':num = 1;break;
case 'r':num = 2;break;
}
*f = (*f&(~(3<<3))) |(num<<3);
printf("%d\n",*f);
while(getchar()!='\n');
}
int main(int argc, char** argv){
unsigned long f=0;
char c;
display(f);
while((c=getchar())!='\n'){
while(getchar()!='\n');
switch(c){
case 'f':change_font(&f);break;
case 's':change_size(&f);break;
case 'a':change_ali(&f);break;
case 'b':f|=4;break;
case 'i':f|=2;break;
case 'u':f|=1;;break;
case 'q':printf("Bye");exit(EXIT_SUCCESS);
}
display(f);
}
return 0;
}