未名

                                             北国风光,千里冰封,万里雪飘。 江山如此多娇,引无数英雄竞折腰。

导航

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

Posted on 2014-08-15 20:59  未 名  阅读(3828)  评论(1编辑  收藏  举报

问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值。

我们知道数值在内存中都是以二进制的形式存放的,假如我们是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