首页 > 代码库 > C语言位操作的算法
C语言位操作的算法
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.代码说明:包括头文件和源文件,封装了许多位操作函数,都是经过实际测试,可以直接使用
C语言位操作的算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。