1.头文件

 #ifndef _INC_BITOPERATION
#define _INC_BITOPERATION
#endif
/*
封装了所有的位操作运算
*/
#include<stdio.h>
#include<stdlib.h> /************************四字节操作,如int ,long等类型**********************/ /*置位int数num的第N个位*/
void setInt(int *num, int N);
/*清零int数num的第N个位*/
void clearInt(int *num, int N);
/*统计num中是1的位数,返回位数*/
int statIntOne(int num);
/*统计num中是0的位数,返回位数*/
int statIntZero(int num);
/*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/
int reverseInt(int *num);
/*以二进制形式打印一个整数*/
void printfIntBinary(int num);
/*循环左移位的实现num左移N位*/
int moveToLeft(int num, int N);
/*循环右移位的实现num右移N位*/
int moveToRight(int num, int N);
/*使用位运算异或实现两个变量值的交换*/
void exchange(int *a, int *b);
/*获取int数num的第N个位的值,0或1*/
int getIntBit(int num, int N);
/*打印一个int数在内存中的二进制码*/
int printfBinCode(int num);
/*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/
void printfSrcCode(int num);
/*打印一个unsigned char 类型的二进制码*/
void printfCharCode(unsigned char s);
/*打印一个浮点数的二进制码*/
void printfFloatCode(float f);

2.源文件

#include<stdio.h>
#include<stdlib.h> /*置位int数num的第N个位*/
void setInt(int *num, int N)
{
if (N > )
{
printf("超出置位范围0-31");
return;
}
*num |= ( << N);
}
/*清零int数num的第N个位*/
void clearInt(int *num, int N)
{
if (N > )
{
printf("超出置位范围0-31");
return;
}
*num &= ~( << N);
}
/*统计num中是1的位数,返回位数*/
int statIntOne(int num)
{
int count = ; for (int i = ; i < ; i++)
{
int t = num & ;
if (t == )
count++; num = num >> ;
}
return count; }
/*统计num中是0的位数,返回位数*/
int statIntZero(int num)
{
int count = ; for (int i = ; i < ; i++)
{
int t = num & ;
if (t == )
count++; num = num >> ;
}
return count; }
/*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/
int reverseInt(int *num)
{ int tem = *num;
for (int i = ; i < ; i++)
{
int t = tem & ;//1.取出每一位的值, //2.将第0位的值置给31,第一位的值置给30
if (t == )//
{
setInt(num, -i);
//printf("%d\n", *num);
}
else
{ clearInt(num, -i);
//printf("%d\n", *num);
}
tem = tem >> ; } return num; }
/*以二进制形式打印一个整数*/
void printfIntBinary(int num)
{
reverseInt(&num);
for (size_t i = ; i < ; i++)
{ int t = num & ;
printf("%d", t);
num = num >> ;
}
}
/*循环左移位的实现num左移N位*/
int moveToLeft(int num,int N)
{
for (int i = ; i < N; i++)
{
int t = num & ( << );//1.取出最高位的值,
num = num << ;//左移一位
//2.先将第0位的值置给31,
if (t != )//
{
setInt(&num, );
//printf("%d\n", *num);
}
else
{ clearInt(&num, );
//printf("%d\n", *num);
}
}
return num; }
/*循环右移位的实现num右移N位*/
int moveToRight(int num, int N)
{
for (int i = ; i < N; i++)
{
int t = num & ;//1.取出每一位的值,
num = num >> ;
//2.先将第0位的值置给31,
if (t == )//
{
setInt(&num, );
//printf("%d\n", *num);
}
else
{ clearInt(&num, );
//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 > )
{
printf("超出置位范围0-31");
return;
}
int t = (num & ( << N));
if (t == )
{
return ;
}
else
{
return ;
} }
/*打印一个int数在内存中的二进制码,正数就是它的原码,负数就是它的补码*/
int printfBinCode(int num)
{
int N = ;
while (N >= )
{
if (getIntBit(num,N))
{
printf("");
}
else
{
printf("");
}
N--;
}
}
/*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/
void printfSrcCode(int num)
{
if (num >= )
{
printfBinCode( num);
}
else
{
num = num - ;
num = ~num;
setInt(&num, );
printfBinCode(num); }
} /*打印一个unsigned char 类型的二进制码*/
void printfCharCode(unsigned char s)
{
int N = ;
while (N >= )
{
if (getIntBit(s, N))
{
printf("");
}
else
{
printf("");
}
N--;
}
}
/*打印一个浮点数的二进制码*/
void printfFloatCode(float f)
{
unsigned char *p;
p = (unsigned char *)&f;
int M = ;
while (M >= )
{
printfCharCode(*(p + M));
M--;
} }

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

  

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

  1. C语言位操作--奇偶校验算法

    信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过 ...

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

    先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题 ...

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

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  4. C语言 位操作

    c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...

  5. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  6. C语言版数据结构算法

    C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...

  7. 用scheme语言实现SPFA算法(单源最短路)

    最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...

  8. C语言之广度优先算法

    广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标结点(结点就是那些圆球球,其中有一个或者多个是目标结点)或者搜完了整个图都没找到目标结点就停止搜索. ...

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

    对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: ...

随机推荐

  1. cocos2dx3.0导出自定义类到lua的方法详细步骤

    我写了一个用3.0的工具导出类到lua,自动生成代码的方法. 以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了. 下面我就在说下具体做法.1.安装必要 ...

  2. Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统

    最近给一个客户安装oracle 11gr2 概述: 操作系统:linux 32位操作系统 [oracle@nbsrfx response]$ uname -aLinux nbsrfx 2.6.32-5 ...

  3. 解释器模式(Interpreter)

    解释器模式(Interpreter)解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. Context类是一个上下文环境类,Plus和Minus分别是用来计 ...

  4. Laravel 框架安装

    Composer 在命令行执行 create-project 来安装 Laravel:就是下面这一句话就OK了!composer create-project laravel/laravel --pr ...

  5. ibv_open_device()函数

    struct ibv_context *ibv_open_device(struct ibv_device *device); 描述 函数会创建一个RDMA设备相关的context:可以通过ibv_c ...

  6. java 之 迭代器模式(大话设计模式)

    众所周知,java是编程语言中的高级语言,在java的世界里,已经有前辈为我们封装好了各个很好用的框架,工具类等,今天笔者想说的迭代器模式也已经被封装过. 就是我们经常使用的for循环迭代器.或者It ...

  7. Windows 服务多语言化时读取配置文件失败的问题。

    在Installer中,按一般读取配置文件的方法(ConfigurationManager.AppSettings["CultureName"])读取不到内容. 可以这样读取: v ...

  8. tyvj4877 组合数

    1.组合数 (zero.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合:从m个不 ...

  9. struts2摘抄

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.struts使 ...

  10. TP3.2 图片上传及缩略图

    基于TP自带的上传文件的类, Think/Upload.class.php 设置表单的enctype属性 下面是上传的具体方法 /** * 图片上传处理 * @param [String] $path ...