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.代码说明:包括头文件和源文件,封装了许多位操作函数,都是经过实际测试,可以直接使用
需要程序源码的可以加我微信x241602私聊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?