前言
前两天做C语言二级模拟题,发现其中涉及到了一部分位运算的题目,但是自己从来没去学过,于是就抽时间了解了一下。并编成了c程序方便自己了解,但是在进行位运算的时候还是显示出来二进制数比较容易学习,十转二进制正整数还容易写,但是碰到了负数真的很难想了,看看了原码、反码、补码的概念后想了好长时间才写出来负数的转换。最后和位运算整合了一下,写了下面这个C程序。
代码实例
#include<stdio.h>
#define N 16//设置共显示16位二进制,可根据自己的需要调整
void rec(char s[],char i)//初始化数组
{
int k;
for(k=0;k<N;k++)
s[k]=i;
}
void fun(int c,char s[])//十进制转二进制,并将二进制数储存到s数组
{
int i,j,k,x;
if(c>=0){//十进制数大于等于0时的转换方式
rec(s,'0');
for(j=c,k=N-1;j!=0;k--)
{
i=j%2;
if(i==0)
s[k]='0';
else
s[k]='1';
j/=2;
}
}else//十进制数小于0时的转换方式
{
rec(s,'1');
for(j=-c,k=N-1,x=0;k>=0;k--)
{
if(j!=0)
{
i=j%2;
if(i==0)//进行反码操作
s[k]='1';
else
s[k]='0';
j/=2;
}
if(x==0)//判断是否进行了补码操作
if(s[k]=='1')
s[k]='0';
else {
s[k]='1';
x=1;
}
}
}
}
void and(int a,int b,char s[])//and运算 &
{
int c=0;
printf("这是a&b的二进制运算\n");
c=a&b;
fun(a,s);
printf("a=%3d=%s\n",a,s);
fun(b,s);
printf("a=%3d=%s\n",b,s);
fun(c,s);
printf("a=%3d=%s\n",c,s);
}
void or(int a,int b,char s[])// or运算 |
{
int c=0;
printf("这是a|b的二进制运算\n");
c=a|b;
fun(a,s);
printf("a=%3d=%s\n",a,s);
fun(b,s);
printf("a=%3d=%s\n",b,s);
fun(c,s);
printf("a=%3d=%s\n",c,s);
}
void xor(int a,int b,char s[])// xor运算 ^
{
int c=0;
printf("这是a^b的二进制运算\n");
c=a ^b;
fun(a,s);
printf("a=%3d=%s\n",a,s);
fun(b,s);
printf("a=%3d=%s\n",b,s);
fun(c,s);
printf("a=%3d=%s\n",c,s);
}
void not(int a,char s[])// not运算 ~
{
int c=0;
printf("这是~a的二进制运算\n");
c=~a;
fun(a,s);
printf("a=%3d=%s\n",a,s);
fun(c,s);
printf("a=%3d=%s\n",c,s);
}
void shl(int a,char s[])// shl运算 <<
{
int c=0;
printf("这是a<<1的二进制运算\n");
c=a<<1;
fun(a,s);
printf("a=%3d=%s\n",a,s);
fun(c,s);
printf("a=%3d=%s\n",c,s);
}
void shr(int a,char s[])// shr运算 >>
{
int c=0;
printf("这是a>>1的二进制运算\n");
c=a>>1;
fun(a,s);
printf("a=%3d=%s\n",a,s);
fun(c,s);
printf("a=%3d=%s\n",c,s);
}
void main()
{
int a=8,b=4,i,j,k;
char s[N+1]={'\0'};//储存二进制数
and(a,b,s);
or(a,b,s);
xor(a,b,s);
not(a,s);
shl(a,s);
shr(a,s);
}
运行结果
这是a&b的二进制运算
a= 8=0000000000001000
a= 4=0000000000000100
a= 0=0000000000000000
这是a|b的二进制运算
a= 8=0000000000001000
a= 4=0000000000000100
a= 12=0000000000001100
这是a^b的二进制运算
a= 8=0000000000001000
a= 4=0000000000000100
a= 12=0000000000001100
这是~a的二进制运算
a= 8=0000000000001000
a= -9=1111111111110111
这是a<<1的二进制运算
a= 8=0000000000001000
a= 16=0000000000010000
这是a>>1的二进制运算
a= 8=0000000000001000
a= 4=0000000000000100