4.1.1任务描述
写一个程序,从键盘上接收一个整数,用二进制形式输出这个整数。
#include<stdio.h>
#include<stdlib.h>
intmain(void){
//定义变量
intnum,a[32],i=0;
//提示用户输入内容
printf("请输入一个十进制整数:\n");
//强制刷新
fflush(stdout);
//接收从键盘上输入的内容
scanf("%d",&num);
while(num!=0){
a[i++]=num%2;
num=num/2;
}
for(i--;i>=0;i--){
printf("%d",a[i]);
}
printf("\n");
returnEXIT_SUCCESS;
}
5.1.1作业任务
已知intx=5,y=3求解下列表达式的值
!x,~x,x&y,x&&y,x|y,x||y,x^y
#include<stdio.h>
#include<stdlib.h>
intmain(){
intx=5,y=3;
printf("%d\n",!x);
printf("%d\n",x);
printf("%d\n",~x);
printf("%d\n",x&y);
printf("%d\n",x&&y);
printf("%d\n",x|y);
printf("%d\n",x||y);
printf("%d\n",x^y);
returnEXIT_SUCCESS;
}
======================================================================
5.1.1作业任务
完成下列任务(手写需要步骤)
(1)把十进制数278转换成二进制、八进制、十六进制。
(2)把二进制数100100101转换成八进制、十六进制、十进制。
(3)把八进制706转换成十进制、十六进制、二进制。
(4)把十六进制FA01转换为二进制、八进制、十进制。
(1)278换成二进制为:100010110
八进制为:426
十六进制:116
(2)100100101转换八进制:445
十六进制:125
十进制为:293
(3)706转换成十进制:454
十六进制:1C6
二进制为:111000110
(4)FA01转换二进制:1111101000000001
八进制为:175001
十进制为:64001
======================================================================
5.2.1作业任务
完成下列任务(手写需要步骤)
(1)求27&5
(2)求17|12
(3)求27&5
(4)求27^5
(5)求27<<5
(6)求27>>5
#include<stdio.h>
#include<stdlib.h>
intmain(){
printf("%d\n",27&5);
printf("%d\n",17|12);
printf("%d\n",27&&5);
printf("%d\n",27^5);
printf("%d\n",27<<5);
printf("%d\n",27>>5);
returnEXIT_SUCCESS;
}
======================================================================
5.3.1作业任务
写一函数实现两个数的交换,交换变量利用位运算实现。
#include<stdio.h>
#include<stdlib.h>
voidfun(int*a,int*b){
//按位异或运算符
*a=(*a)^(*b);
*b=(*b)^(*a);
*a=(*a)^(*b);
}
intmain(){
//定义变量
inta,b;
printf("请输入两个整数:\n");
fflush(stdout);
scanf("%d,%d",&a,&b);
printf("转换前的顺序:a=%d,b=%d\n",a,b);
fun(&a,&b);
printf("输出转换顺序后的数字:a=%d,b=%d\n",a,b);
returnEXIT_SUCCESS;
}
======================================================================
5.4.1作业任务
编写一个函数用来实现左右循环移位,函数名为move,调用方法为move(value,n)其中value为要循环位移的数,n为位移的位数。例如你n<0表示为左移;n>0为右移,n=4表示要右移4位,n=-3表示左移3位。
#include<stdio.h>
#include<stdlib.h>
intmain(){
unsignedmoveright(unsigned,int);
unsignedmoveleft(unsigned,int);
unsigneda;
intn;
printf("\ninputanoctalnumber:");
fflush(stdout);
scanf("%o",&a);
printf("inputn:");
scanf("%d",&n);
if(n>0){
moveright(a,n);
printf("result:%o\n",moveright(a,n));
}else{
n=-n;
moveleft(a,n);
printf("result:%o\n",moveleft(a,n));
}
returnEXIT_SUCCESS;
}
unsignedmoveright(unsignedvalue,intn){
unsignedz;
z=(value>>n)|(value<<(16-n));
return(z);
}
unsignedmoveleft(unsignedvalue,intn){
unsignedz;
z=(value>>(16-n))|(value<<n);
return(z);
}
======================================================================
5.5.1作业任务
设计一个函数,使给出一个数的源码能得到该数的补码。
#include<stdio.h>
#include<stdlib.h>
intmain(){
unsignedinta;//定义整型a
Unsignedintgetbits(unsigned);//加载方法签名
printf("请输入八进制数:\n");
fflush(stdout);//换行之后打印字符串
scanf("%o",&a);//输入需要转换的数字a
printf("结果为:%o\n",getbits(a));//将输入的a传入到方法getbits中计算结果并打印出来
returnEXIT_SUCCESS;
}
unsignedintgetbits(unsignedvalue)
{
unsignedintz;//定义无符号整型z
z=value&0100000;//将传入的参数value和0100000进行与操作之后的结果赋值给z
if(z==0100000)//判断z是否等于0100000,等于执行下面操作
z=~value+1;//传入的参数value取反加一赋值给z
else
z=value;//否则将value本身赋值给z
return(z);//返回结果z
}
======================================================================
5.6.1作业任务
(1)定义一个位域,位域列表中有4个变量,
(2)分别给位域中变量赋值,
(3)输出变量的值
#include<stdio.h>
#include<stdlib.h>
structlocation{
//定义无符号整形变量
unsignedinta:1;
unsignedintb:2;
unsignedintc:2;
unsignedintd:3;
}lo;
intmain(){
//给变量赋值
lo.a=1;
lo.b=3;
lo.c=2;
lo.d=7;
printf("%d,%d,%d\n",lo.a,lo.b,lo.c,lo.d);
returnEXIT_SUCCESS;
}