C语言位操作的算法

1.头文件

 1 #ifndef _INC_BITOPERATION
 2 #define _INC_BITOPERATION
 3 #endif
 4 /*
 5 封装了所有的位操作运算
 6 */
 7 #include<stdio.h>
 8 #include<stdlib.h>
 9 
10 /************************四字节操作,如int ,long等类型**********************/
11 
12 /*置位int数num的第N个位*/
13 void setInt(int *num, int N);
14 /*清零int数num的第N个位*/
15 void clearInt(int *num, int N);
16 /*统计num中是1的位数,返回位数*/
17 int statIntOne(int num);
18 /*统计num中是0的位数,返回位数*/
19 int statIntZero(int num);
20 /*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/
21 int reverseInt(int *num);
22 /*以二进制形式打印一个整数*/
23 void printfIntBinary(int num);
24 /*循环左移位的实现num左移N位*/
25 int moveToLeft(int num, int N);
26 /*循环右移位的实现num右移N位*/
27 int moveToRight(int num, int N);
28 /*使用位运算异或实现两个变量值的交换*/
29 void exchange(int *a, int *b);
30 /*获取int数num的第N个位的值,0或1*/
31 int getIntBit(int num, int N);
32 /*打印一个int数在内存中的二进制码*/
33 int printfBinCode(int num);
34 /*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/
35 void printfSrcCode(int num);
36 /*打印一个unsigned char 类型的二进制码*/
37 void printfCharCode(unsigned char s);
38 /*打印一个浮点数的二进制码*/
39 void printfFloatCode(float f);

2.源文件

#include<stdio.h>
#include<stdlib.h>

/*置位int数num的第N个位*/
void setInt(int *num, int N)
{
    if (N > 31)
    {
        printf("超出置位范围0-31");
        return;
    }
    *num |= (1 << N);
}
/*清零int数num的第N个位*/
void clearInt(int *num, int N)
{
    if (N > 32)
    {
        printf("超出置位范围0-31");
        return;
    }
    *num &= ~(1 << N);
}
/*统计num中是1的位数,返回位数*/
int statIntOne(int num)
{
    int count = 0;

    for (int i = 0; i < 32; i++)
    {
        int t = num & 1;
        if (t == 1)
            count++;

        num = num >> 1;
    }
    return count;
    
}
/*统计num中是0的位数,返回位数*/
int statIntZero(int num)
{
    int count = 0;

    for (int i = 0; i < 32; i++)
    {
        int t = num & 1;
        if (t == 0)
            count++;

        num = num >> 1;
    }
    return count;

}
/*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/
int reverseInt(int *num)
{

    int tem = *num;
    for (int i = 0; i < 32; i++)
    {
        int t = tem & 1;//1.取出每一位的值,
        
        //2.将第0位的值置给31,第一位的值置给30
        if (t == 1)//
        {
            setInt(num, 31-i);
            //printf("%d
", *num);
        }
        else
        {
        
            clearInt(num, 31-i);
            //printf("%d
", *num);
        }
        tem = tem >> 1;
        

        
    }
    
    return num;

}
/*以二进制形式打印一个整数*/
void printfIntBinary(int num)
{
    reverseInt(&num);
    for (size_t i = 0; i < 32; i++)
    {
        
        int t = num & 1;
        printf("%d", t);
        num = num >> 1;
    }
}
/*循环左移位的实现num左移N位*/
int moveToLeft(int num,int N)
{
    for (int i = 0; i < N; i++)
    {
        int t = num & (1 << 31);//1.取出最高位的值,
        num = num << 1;//左移一位
        //2.先将第0位的值置给31,
        if (t != 0)//
        {
            setInt(&num, 0);
            //printf("%d
", *num);
        }
        else
        {

            clearInt(&num, 0);
            //printf("%d
", *num);
        }
    }
        return num;

}
/*循环右移位的实现num右移N位*/
int moveToRight(int num, int N)
{
    for (int i = 0; i < N; i++)
    {
        int t = num & 1;//1.取出每一位的值,
        num = num >> 1;
        //2.先将第0位的值置给31,
        if (t == 1)//
        {
            setInt(&num, 31);
            //printf("%d
", *num);
        }
        else
        {

            clearInt(&num, 31);
            //printf("%d
", *num);
        }

    }
        return num;
        
}
/*使用位运算异或实现两个变量值的交换*/
void exchange(int *a, int *b)
{
    *a = (*a) ^ (*b);
    *b = (*a) ^ (*b);
    *a = (*a) ^ (*b);
}
/*获取int数num的第N个位的值,0或1*/
int getIntBit(int num, int N)
{
    if (N > 31)
    {
        printf("超出置位范围0-31");
        return;
    }
    int t = (num  & (1 << N));
    if (t == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
        
}
/*打印一个int数在内存中的二进制码,正数就是它的原码,负数就是它的补码*/
int printfBinCode(int num)
{
    int N = 31;
    while (N >= 0)
    {
        if (getIntBit(num,N))
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
        N--;
    }
}
/*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/
void printfSrcCode(int num)
{
    if (num >= 0)
    {
        printfBinCode( num);
    }
    else
    {
        num = num - 1;
        num = ~num;
        setInt(&num, 31);
        printfBinCode(num);



    }
}

/*打印一个unsigned char 类型的二进制码*/
void printfCharCode(unsigned char s)
{
    int N = 7;
    while (N >= 0)
    {
        if (getIntBit(s, N))
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
        N--;
    }
}
/*打印一个浮点数的二进制码*/
void printfFloatCode(float f)
{
    unsigned char *p;
    p = (unsigned char *)&f;
    int M = 3;
    while (M >= 0)
    {
        printfCharCode(*(p + M));
        M--;
    }
        
        
    
}

3.代码说明:包括头文件和源文件,封装了许多位操作函数,都是经过实际测试,可以直接使用

  

需要程序源码的可以加我微信x241602私聊。
原文地址:https://www.cnblogs.com/huipengbo/p/6854675.html