位运算和十转二进制

前言

前两天做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

添加新评论

评论列表