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\n", *num);
        }
        else
        {

            clearInt(num, 31-i);
            //printf("%d\n", *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\n", *num);
        }
        else
        {

            clearInt(&num, 0);
            //printf("%d\n", *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\n", *num);
        }
        else
        {

            clearInt(&num, 31);
            //printf("%d\n", *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.代码说明:包括头文件和源文件,封装了许多位操作函数,都是经过实际测试,可以直接使用

  

时间: 2024-10-11 04:15:30

C语言位操作的算法的相关文章

0.数据结构(python语言) 基本概念 算法的代价及度量!!!

先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题(需求)的具体的例子 算法:解决问题的过程,是对一个计算过程的严格描述 程序:程序可以看作是采用计算装置能够处理的语言描述的算法 一.算法的5大性质 有穷性(算法描述的又穷性):算法必须用有限长的描述说清楚 能行性:算法的每一步都是可行的,也就是说,每一步都能通过执行有限次数完成 确定性:别人看了过

c语言递推算法1

递推算法之一:倒推法 1.一般分析思路: if 求解初始条件F1 then begin { 倒推 } 由题意(或递推关系)确定最终结果Fn; 求出倒推关系式Fi-1 =G(Fi ); i=n; { 从最终结果Fn出发进行倒推 } while 当前结果Fi非初始值F1 do 由Fi-1=G(Fi)倒推前项; 输出倒推结果F1和倒推过程; end { of then } else begin { 顺推 } 由题意(或递推关系)确定初始值F1(边界条件); 求出顺推关系式Fi=G(Fi-1); i=1

C语言值基本算法43—总结

C程序的基本算法共涵盖42个例题,包含了枚举.排列.逻辑判断.迭代.递推.字符串操作.矩阵操作.格式输出等内容. 相关的实现方法有的显得很笨拙,但足够说明问题,而且每个程序都经过作者亲测,保证可以运行.之所以称之为基本算法,就是为了测试基础知识的掌握,都是从原始的角度进行处理,没有运用过于花哨的处理技巧,作者也是在学习中进步,也希望这些代码对于没有基础或者基础薄弱的朋友带来帮助. 至此,基本知识就掌握了,我们常常会听说C的强大,因为它是面向过程的,在数学领域具有极好的应用,有必要进行进一步的学习

C语言实现FIFO算法与LRU算法

在操作系统中,当程序在运行过程中,若其所要访问的页面不再内存中而需要把他们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存调出一页程序或数据送磁盘的兑换区中.但哪一个页面调出,须根据一定的算法确定.通常,把选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms).置换算法的好坏将直接影响到系统的性能. 1) 先进先出(FIFO)页面置换算法 该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.该算法实现简单,只需

C语言版数据结构算法

C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu.com/s/1u8YW897MjJkoOfsbHuadFQ 在上一篇的FIFO中就是基于数据结构思维中的队列实现的,而基本的数据结构内容还有 算法效率分析.线性表.栈和队列.串.数组和广义表.树和二叉树.图.查表.排序.动态存储管理 上面两个链接就是<数据结构(C语言版)>严蔚敏教授严奶奶的书籍

C语言qsort函数算法性能测试

对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 //int (*Comp)(const void *,const void *) int compare(const vo

C语言位操作

最近在重新学习C语言,使用的书为Brian W.Kernignan 和 Dennis M.Ritchie的<C程序设计语言> .今晚读到了位操作,并写了一些简单的测试程序. C语言提供了6个位操作运算符.这些运算符只能作用于整型操作数,即只能作用于带着有符号或无符号的char.short.int与long类型. 这六种位操作运算符为: & 按位与 | 按位或 ^ 按位抑或 << 左移 >> 右移 ~ 按位求反 位操作常用于一些开关性质的操作.例如: x = x

R语言之Apriori算法应用

一. 概念 关联分析用于发现隐藏在大型数据集中的有意义的联系.所发现的联系可以用关联规则(association rule)或频繁项集的形式表示. 项集:在关联分析中,包含0个或多个项的集合被称为项集(itemset).如果一个项集包含k个项,则称它为k-项集.例如:{啤酒,尿布,牛奶,花生} 是一个4-项集.空集是指不包含任何项的项集. 关联规则(association rule):是形如 X → Y 的蕴含表达式,其中X和Y是不相交的项集,即:X∩Y=∅.关联规则的强度可以用它的支持度(su

10个经典的C语言面试基础算法及代码

算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.本文是近百个C语言算法系列的第二篇,包括了经典的Fibonacci数列.简易计算器.回文检查.质数检查等算法.也许他们能在你的毕业设计或者面试中派上用场. 1.计算Fibonacci数列 Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21. C语言实现的代码如下: 1 2 3 4 5 6 7 8 9 10