C语言位操作的算法
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语言位操作的算法的更多相关文章
- C语言位操作--奇偶校验算法
信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过 ...
- 0.数据结构(python语言) 基本概念 算法的代价及度量!!!
先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题 ...
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- C语言 位操作
c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- C语言版数据结构算法
C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...
- 用scheme语言实现SPFA算法(单源最短路)
最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
- C语言之广度优先算法
广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标结点(结点就是那些圆球球,其中有一个或者多个是目标结点)或者搜完了整个图都没找到目标结点就停止搜索. ...
- C语言qsort函数算法性能测试
对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: ...
随机推荐
- IMDB TOP 250爬虫
这个小学期Python大作业搞了个获取IMDB TOP 250电影全部信息的爬虫.第二次写爬虫,比在暑假集训时写的熟练多了.欢迎大家评论. ''' ************************** ...
- CentOS7 安装sentry(最新)
Sentry 是一款基于 Django实现的错误日志收集和聚合的平台,它是 Python 实现的,但是其日志监控功能却不局限于python,对诸如 Node.js, php,ruby, C#,ja ...
- javaScript(JS)强制保留两位小数的输入数校验和小数保留
参考来源于网络,如有侵权,请联系作者删除: 输入input 的格式校验: $(function(){ var data = $.trim($("#inputId").val()); ...
- spring中的自定义标签
为了给系统提供可配置化支持,一般会用原生态的方式去解析定义好的XML文件,然后转化为配置对象.这种方式对于简单.单一的配置文件,或者是XML配置格式固定的配置文件,比较容易处理.但是对于一些配置非常复 ...
- RPC是什么
RPC是什么? 通俗的讲就是,调用远程计算机上的服务,就像调用本地服务一样.通常包含传输协议和编码协议. RPC可以基于HTTP或TCP协议,但基于HTTP协议的RPC性能却不如基于TCP协议的RPC ...
- Java开发步骤
3.编辑Java源程序 使用纯文本编辑器,比如记事本notpad.exe:EditPlus.UltraEdit等专业的纯文本编辑器. Word不是纯文本编辑器. 需求:写一个Java程序,在控制台打印 ...
- 第十一章 泛型算法 C++ PRIMER
vector<int>::const_iterator result = find(vector.begin(). vector.end(),search_value); 如果查找失败,分 ...
- 【二十三】php之预定义超全局变量
php提供了九种预定义超全局变量: $_GET.$_POST.$_REQUEST.$_SERVER.$_ENV.$_FILE. $_COOKIE.$_SESSION. $GLOBALS 1.$_GET ...
- MySQL之事务的四大特性
事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎能够成功地对数据应用该组查询的全部语句,那么久执行该组查询.如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有语句都不会执 ...
- centos7 忘记mysql root密码办法
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的状态下,其他的用户也可以任意地登录和 ...