zoukankan      html  css  js  c++  java
  • 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私聊。
  • 相关阅读:
    Linux配置环境变量
    入坑CV DL一些基础技能学习
    (Linux)初探cmake .和make命令
    Django rest framework 之分页
    Django rest framework 之版本
    通用权限框架
    堡垒机
    kingadmin
    CRM 客户关系管理系统
    Torando 入门
  • 原文地址:https://www.cnblogs.com/huipengbo/p/6854675.html
Copyright © 2011-2022 走看看