二进制逆序

要求计算二进制(16位)的逆序,如数12345用二进制表示为:

00110000 00111001

将它逆序,我们得到了一个新的二进制数:

10011100 00001100

最容易想到的方法就是依次交换两端的数据,从右向左遍历数字,当i位遇到1时,将逆序数字对应的(17-i)位设为1。

def reverseBinary(num):
    print bin(num)
    new=0
    tmp=(1<<15)
    for i in xrange(16):
        if num&1:
            new|=tmp
        tmp>>=1
        num>>=1
    return new

if __name__==‘__main__‘:
    print bin(reverseBinary(12345))

>>>
0b0011000000111001
0b1001110000001100

还有一种高低位互换类似于合并排序的解法。

设想一下,逆序‘ab‘,为‘ba‘。

逆序abcd,可以先两两交换为cdab,然后一一交换为dcba。

逆序abcdefgh,先四四交换efghabcd,然后两两交换fehgcdab,然后一一交换efghdcaba。

那么可以推广到二进制表示:

第一步:每2位为一组,组内高低位交换

00 11 00 00 00 11 10 01

-->00 11 00 00 00 11 01 10

第二步:每4位为一组,组内高低位交换

0011 0000  0011 0110

-->1100 0000 1100 1001

第三步:每8位为一组,组内高低位交换

11000000 11001001

-->00001100 10011100

第四步:每16位为一组,组内高低位交换

0000110010011100

-->1001110000001100

高低位互换时操作大概就是偶数位左移1位,奇数位右移1位

原 数   00110000 00111001

奇数位 0_1_0_0_ 0_1_1_0_

偶数位 _0_1_0_0 _0_1_0_1

其余位数用0填充,然后将奇数位右移一位,偶数位左移一位,此时将这两个数据做按位与运算,即可以达到奇偶位上数据交换的效果了:

def reverseBinary(a):
    a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1)
    a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2)
    a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4)
    a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8)
    return a
if __name__==‘__main__‘:
    print bin(reverseBinary(12345))

  

二进制逆序

时间: 2024-12-23 06:37:03

二进制逆序的相关文章

C语言整数按照二进制逆序,输出逆序后的整数值

问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值. 我们知道数值在内存中都是以二进制的形式存放的,假如我们是32位机,每8位为一个字节,int型在32位机上是占4个字节,即32位. 如   2  = 0000 0000 0000 0000 0000 0000 00000 0010(32位) 逆 ^2  = 0100 0000 0000 0000 0000 0000 00000 0000  (这里用^表示逆转) 那么这个操作要如何执行呢?首先补充

C语言将整数以二进制逆序

问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值. 我们知道数值在内存中都是以二进制的形式存放的,假如我们是32位机,每8位为一个字节,int型在32位机上是占4个字节,即32位. 如   2  = 0000 0000 0000 0000 0000 0000 00000 0010(32位) 逆 ^2  = 0100 0000 0000 0000 0000 0000 00000 0000  (这里用^表示逆转) 那么这个操作要如何执行呢?首先补充

求一个数的二进制逆序之后所对应的数

例:1 00000000 00000000 00000000 00000001 逆序之后是: 10000000 00000000 00000000 00000000 #include<stdio.h> #include<stdlib.h> int main() {                  int n = 0;                  int num =0;                  int i = 0;                 scanf( &q

二进制打印与逆序_C语言(转)

//二进制逆序 by MoreWindows( http://blog.csdn.net/MoreWindows ) #include <stdio.h> //二进制打印函数 template <class T> void PrintfBinary(T a) { int i; for (i = sizeof(a) * 8 - 1; i >= 0; --i) { if ((a >> i) & 1) putchar('1'); else putchar('0'

待字闺中之逆序分析

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 一个整数,可以表示为二进制的形式,请给出尽可能多的方法对二进制进行逆序操作. 例如:10000110 11011000的逆序为 00011011 01100001 分析:题目中说是一个整数,对它的二进制进行逆序.并不是一个01字符串,或者01的数组.那么我们该如何解决这个问题呢?方法还是比较多的,有的中规中矩.有的非常巧妙.我们要掌握中规中规的方法,见识更多的巧妙的方法.慢慢的,能够举一反三,在遇到新的问题时

【c语言】将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数

// 将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数 #include <stdio.h> // 从原数拿出最低位,放到mid中,mid左移,原数右移 int reverse(int a) { int mid = 0; int bit; int n = 31; for (; n > 0; --n) { bit = a & 1; mid |= bit; mid <<= 1; a >>= 1; } return mid; } int main

百度实习在线笔试题【逆序问题】

自己写的代码,未经测试 ////baidu实习岗在线测评 ////一组01的二进制字符串,要求不为逆序,需要交换几次位置. // #include <iostream> #include <vector> using namespace std; typedef struct{ unsigned int num; vector<char*> data; }SInput; void pInputData(SInput &input) { int i; cin>

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

嵌入式 linux和c 指针顺序和逆序存储

顺序存储 #include<stdio.h>int main(){ char a[10]="1234567890"; char b[9]; char *p=a; char *q=b; int i=10; while(i--) *q++=*p++; printf("%s\n",b); return 0;} 逆序存储 #include<stdio.h>int main(){ char a[10]="1234567890"; c