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. Elasticsearch6.0及其head插件安装

    Elasticsearch6.0及其head插件安装 1.下载并解压elasticsearch 2.修改elasticsearch.yml文件 # 集群的名字 cluster.name: my-app ...

  2. (11.28)Java小知识!

    关于继承的继承机制:继承中最常使用的两个关键字是exteds和implements.今天主要和大家分享extends的知识点.这两个关键字的使用决定了一个对象和另一个对象是否是IS-A关系.同时我们还 ...

  3. c语言的内存分析

    1. 进制 1. 什么是进制 ● 是一种计数的方式,数值的表示形式  汉字:十一   十进制:11  二进制:1011  八进制:13 ● 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个 ...

  4. appium+Android studio安装与配置

    一. 关于JDK 安装,以及Java环境的设置 1.下载JDK1.6,选择对应的安装路径 2.配置相应的Java 环境变量 A.属性名称:JAVA_HOME (sdk的安装目录) 属性值:C:Prog ...

  5. JS 函数节流和去抖

    1.什么是节流和去抖? 节流.就是拧紧水龙头让水少流一点,但是不是不让水流了.想象一下在现实生活中有时候我们需要接一桶水,接水的同时不想一直站在那等着,可能要离开一会去干一点别的事请,让水差不多流满一 ...

  6. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  7. 洛谷最短路计数SPFA

    题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...

  8. 深入理解java虚拟机_第三章(上)----->垃圾收集器与内存分配策略

    1.  前言 这一版块内容比较多,分为两篇文章来做笔记.本文讲述上半部分垃圾收集部分;下一篇文章写内存分配部分. 概述 对象已死吗? 引用技术算法 可达性分析算法 再谈引用 两次标记 回收方法区 2. ...

  9. UWP 用Thumb 控件仿制一个可拖动悬浮 Button

    参考了 http://www.cnblogs.com/zhanggaoxing/p/6403430.html,并加以改进. 最终效果::: Thumb 的原生事件 DragStarted,DragDe ...

  10. tensorflow 安装升级

    对于已经安装过的tensorflow,执行以下命令升级到最新版: pip3 install -U tensorflow 目前最新版本1.4