c编程之逆转比特位
2017-12-12 23:44
239 查看
编写一个函数,unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
第一种做法,比较容易想,实际上就是将该位的权改变一下,我们都知道二进制序列中最低位是2^0,最高位是2^31,所以就把x的权该为目标位的权。
比如:25的二进制序列11001
最低位的1乘上2^31就将1移到了最高位,以此类推。
在这里,我采用了用c库中的itoa函数将2进制比特位打印出来可以方便我们校验。
分析:
我们可以分为两部分考虑,第一步将x中的数取出来。按位&1,可以将该位取出,所以将x从低位起的每一位都按位&1,就能将x中的全部取出。
第二步考虑如何放的问题。value初值32个比特位全赋0,将x中取出的1,右移至对应的逆置之后的高位比特位,与value(0)按位|就能将value的该位置1,零则不用管它。
比如说,25的二进制序列11001
将最低位的1取出来,左移31位 按位|0 就到了最高比特位并且置1,此时就存到value中了。
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
第一种做法,比较容易想,实际上就是将该位的权改变一下,我们都知道二进制序列中最低位是2^0,最高位是2^31,所以就把x的权该为目标位的权。
比如:25的二进制序列11001
最低位的1乘上2^31就将1移到了最高位,以此类推。
unsigned int bit_reverse(unsigned int x) { int ret = 0; int i = 0; for (i = 0; i < 32; i++) { ret += ((x >> i) & 1)*pow(2, 31 - i); } return ret; }
unsigned int bit_reverse(unsigned int x) { int value = 0; int top = 32; int i = 0; for (i = 0; i < top; i++) { if (x&(1 << i)) { value |= (1 << ((top - 1) - i)); } } return value; } int main() { char str[33]; int data = 0; printf("please enter:"); scanf("%d", &data); printf("二进制:%s",itoa(data,str,2)); printf("\n"); printf("after reverse:%u\n", bit_reverse(data)); printf("二进制:%s\n", itoa(bit_reverse(data), str, 2)); system("pause"); return 0; }
在这里,我采用了用c库中的itoa函数将2进制比特位打印出来可以方便我们校验。
分析:
我们可以分为两部分考虑,第一步将x中的数取出来。按位&1,可以将该位取出,所以将x从低位起的每一位都按位&1,就能将x中的全部取出。
第二步考虑如何放的问题。value初值32个比特位全赋0,将x中取出的1,右移至对应的逆置之后的高位比特位,与value(0)按位|就能将value的该位置1,零则不用管它。
比如说,25的二进制序列11001
将最低位的1取出来,左移31位 按位|0 就到了最高比特位并且置1,此时就存到value中了。
相关文章推荐
- c语言实现比特位的逆转
- 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello
- 挑战面试编程:链表逆转的多种实现
- 挑战面试编程:链表逆转的多种实现
- 编程之美 2.7 最大公约数 扩展问题之逆转一个整数的二进制表示
- Java网络编程之Socket通信
- UNIX环境C语言编程(12)-进程间通信
- Python While循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为: while 判断条件:
- C#编程入门10_面向对象之继承
- php多进程编程相关资料(以备参考)
- linux网络编程实例
- 程序员编程艺术第一~十章集锦与总结--面试、算法、编程
- 【简单的编程问题2】求一元二次方程的根
- 如何利用TC进行图形编程
- 通用编程能力训练:template
- Python基础编程(五)条件、循环和其他语句
- linux守护进程编程
- GDI+编程小结
- Java编程思想重点
- Linux 网络编程——原始套接字实例:发送 UDP 数据包