整数二进制位反转
2012-10-26 00:24
381 查看
无意间想到这个,写写:
总觉得我的代码风格不够美观,但又不知道怎么改进~
加种实现:
#include <iostream> template <typename IntType> IntType binary_reverse(IntType number) { size_t bit_count = sizeof(IntType) << 3; IntType max_signed = ~((IntType)1 << (bit_count - 1)); IntType rev_num = 0; while (0 != number) { rev_num <<= 1; rev_num |= number & 1; number >>= 1; number &= max_signed; --bit_count; } rev_num <<= bit_count; return(rev_num); } void test_bin_rev(void) { typedef int Integer; Integer array[] = { -49, -1, 0, 1, 49 }; int size = sizeof(array) / sizeof(array[0]); for (int i = 0; i < size; ++i) { Integer encrypt = binary_reverse(array[i]); Integer decrypt = binary_reverse(encrypt); std::cout << "source: " << array[i] << std::endl << "\tencrypt: " << encrypt << std::endl << "\tdecrypt: " << decrypt << std::endl; } } int main(int argc, char * argv[]) { test_bin_rev(); return(0); }
总觉得我的代码风格不够美观,但又不知道怎么改进~
加种实现:
#include <iostream> template <typename IntType> inline void setbit(IntType & number, int pos) { number |= (IntType)1 << pos; } template <typename IntType> inline void clrbit(IntType & number, int pos) { number &= ~((IntType)1 << pos); } template <typename IntType> inline int getbit(IntType number, int pos) { return(((number &= (IntType)1 << pos) >> pos) & 1); } template <typename IntType> IntType binary_reverse(IntType number) { size_t bit_count = sizeof(IntType) << 3; for (int i = 0; i < bit_count / 2; ++i) { int j = bit_count - 1 - i; int m = getbit(number, i); int n = getbit(number, j); if (m != n) { (0 == m) ? clrbit(number, j) : setbit(number, j); (0 == n) ? clrbit(number, i) : setbit(number, i); } } return(number); } void test_bin_rev(void) { typedef int Integer; Integer array[] = { -49, -1, 0, 1, 49 }; int size = sizeof(array) / sizeof(array[0]); for (int i = 0; i < size; ++i) { Integer encrypt = binary_reverse(array[i]); Integer decrypt = binary_reverse(encrypt); std::cout << "source: " << array[i] << std::endl << "\tencrypt: " << encrypt << std::endl << "\tdecrypt: " << decrypt << std::endl; } } int main(int argc, char * argv[]) { test_bin_rev(); return(0); }
相关文章推荐
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法
- [LintCode]413.反转整数
- Java 一个整数的二进制位有多少个1,哪些位是1
- 反转一个整数
- 【我解C语言面试题系列】006 按位反转整数问题
- 算法之反转整数
- 按位反转整数问题
- 取整数序列中的回数Python3,根据字符串反转[::-1]来完成
- 反转一个整数(259----952)
- 计算1个数--计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。
- [leetcode]反转整数
- Reverse Integer--整数的反转
- 计算一个整数二进制位中1的个数
- 整数的反转
- 反转整数
- 【C语言】编写代码实现:求一个整数在内存中的二进制位中1的个数
- 反转整数
- 对一个整数按位反转
- 【C语言】C的一些简单练习题,关于水仙花数,求和,整数高低位输出,制定二进制位替换
- LeetCode里的7.反转整数问题 Java15行