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)a = a << 1 ,表示将a左移一位,如:0010->0100   (一般后面是补0的)

2)b = b >> 1 ,表示将b右移一位,如:0100->0010  (一般前面是补0的)

3)b & 1 ,这个表示按位与操作,比如:2 & 1,其实执行的是如下操作:

0000 0000 0000 0000 0000 0000 00000 0010  = 2

0000 0000 0000 0000 0000 0000 00000 0001  = 1

0000 0000 0000 0000 0000 0000 00000 0000  = 2 & 1 = 0

这个操作,将前31位全部置为0,只保留最后一位不变,效果就是取出最后一位的值。

4)a &= ~1 ,相比这个不需要解释了吧?同3)一样,但是~表示将0的位置,置为1;1的位置,置为0。

5)a |= 1 ,这个表示按位或操作(a = a | 1),比如:2 | 1,其实是执行如下操作:

0000 0000 0000 0000 0000 0000 00000 0010  = 2

0000 0000 0000 0000 0000 0000 00000 0001  = 1

0000 0000 0000 0000 0000 0000 00000 0011  = 2 | 1 = 3

好了,下面看一下如下代码.....

当前环境:win7_32bit,vs2010,c++

 1 #include <stdio.h>
 2
 3 int main(void)
 4 {
 5     int i = 32,a = 2;   //32位 0000 0000 0000 0000 0000 0000 0000 0010 = 2
 6     int b = a;          //另存一份
 7
 8     while (i--)
 9     {
10         a = a << 1;
11         a &= ~1;        //~1 = 1111 1111 1111 1111 1111 1111 1111 1110 确保第31位上为0
12         if (b & 1)      // 1 = 0000 0000 0000 0000 0000 0000 0000 0001
13         {
14             a |= 1;     //确保第31位上为1
15         }
16         b = b >> 1;
17     }
18
19     printf("%d\n",a);
20
21     return 0;
22 }

思想:总体思想就是:

1)首先使a,b的值相等;

2)然后,每次从b尾部取出一位(从第32位一直取到第0位,用i循环控制);注意:b = b >> 1,b一直在右移,以确保每次取出其最后一位。

3)最后,将其追加在a的末尾。注意:a = a << 1,a一直在左移,以确保循环32次之后,末尾第一个追加的数字,抵达第一位。

-------------------------------------------------------------------------------------------------------

原文地址:http://www.cnblogs.com/nchar/p/3915668.html

C语言将整数以二进制逆序,布布扣,bubuko.com

时间: 2024-10-02 13:41:46

C语言将整数以二进制逆序的相关文章

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  (这里用^表示逆转) 那么这个操作要如何执行呢?首先补充

二进制逆序

要求计算二进制(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 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

待字闺中之逆序分析

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

二进制打印与逆序_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'

C语言实现双向非循环链表的逆序打印

我在上一篇博客中<C语言实现双向非循环链表>实现了如何构造一个双向非循环链表,并实现了正向打印.我还在之前一篇博客<C语言实现单链表的逆序打印>中实现了单链表的逆序打印.这篇博客我们来实现对双向非循环链表进行逆序打印,实现起来非常的简单.代码已经上传至 https://github.com/chenyufeng1991/ReverseDoubleLinkedList . 核心代码如下: //打印非循环双向链表,这个其实是正向打印 void printList(Node *pNode

算法-整数的正序和逆序输出

其实上一篇文章用递归实现了整数的正序输出,思考了整数还是可以逆序输出,不过大同小异,没有太多差别: 正序输出 -(void)printOutNumber:(NSInteger)number{ //取整,不断的递归取整,之后取余 if (number>10) { [self printOutNumber:number/10]; } NSLog(@"数值%ld",number%10); } 逆序输出 循环输出,这个比较简单容易理解: -(void)reverseNumber:(NSI

将两个数字逆序输出算法构思

编写一个程序,要求用户输入一个两位整数,然后逆序打印出来: 1. 构思: 使用算术分割实现 1.1 实现方法:设输入的数为N,N%10位个位数,N / 10 位十位数   推广:编写一个程序,要求用户输入三位整数,逆序打印出来: 实现方法:设输入的数为ABC:先从ABC中取出一个两位数(AB或BC或AC),然后用算术分割法实现逆序打印,设先取出的数为BC(BC = ABC % 100),再将BC分离(B = BC / 10 ; C = BC % 10);在将A取出(A = ABC / 100):

1114: 逆序

题目描述 输入n(1<=n<=10)和n个整数,逆序输出这n个整数. 输入 输入n(1<=n<=10),然后输入n个整数. 输出 逆序输出这n个整数,每个整数占4列,右对齐. 样例输入 6 4 5 6 1 2 3 样例输出 3 2 1 6 5 4 #include<stdio.h> int main() { int n; scanf("%d",&n); int a[10]; for(int i=1;i<=n;i++) { scanf(&