C语言位操作的算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C语言位操作的算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3887字,纯文字阅读大概需要6分钟。
内容图文
1.头文件
1 #ifndef _INC_BITOPERATION 2 #define _INC_BITOPERATION 3#endif 4/* 5封装了所有的位操作运算 6*/ 7 #include<stdio.h> 8 #include<stdlib.h> 910/************************四字节操作,如int ,long等类型**********************/1112/*置位int数num的第N个位*/13void setInt(int *num, int N); 14/*清零int数num的第N个位*/15void clearInt(int *num, int N); 16/*统计num中是1的位数,返回位数*/17int statIntOne(int num); 18/*统计num中是0的位数,返回位数*/19int statIntZero(int num); 20/*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/21int reverseInt(int *num); 22/*以二进制形式打印一个整数*/23void printfIntBinary(int num); 24/*循环左移位的实现num左移N位*/25int moveToLeft(int num, int N); 26/*循环右移位的实现num右移N位*/27int moveToRight(int num, int N); 28/*使用位运算异或实现两个变量值的交换*/29void exchange(int *a, int *b); 30/*获取int数num的第N个位的值,0或1*/31int getIntBit(int num, int N); 32/*打印一个int数在内存中的二进制码*/33int printfBinCode(int num); 34/*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/35void printfSrcCode(int num); 36/*打印一个unsigned char 类型的二进制码*/37void printfCharCode(unsigned char s); 38/*打印一个浮点数的二进制码*/39void 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,第一位的值置给30if (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) { return0; } else { return1; } } /*打印一个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.代码说明:包括头文件和源文件,封装了许多位操作函数,都是经过实际测试,可以直接使用
原文:http://www.cnblogs.com/huipengbo/p/6854675.html
内容总结
以上是互联网集市为您收集整理的C语言位操作的算法全部内容,希望文章能够帮你解决C语言位操作的算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。