设为首页 加入收藏

TOP

C语言整数按照二进制逆序,输出逆序后的整数值
2015-01-22 20:57:13 来源: 作者: 【 】 浏览:13
Tags:语言 整数 按照 二进制 输出 后的整 数值
问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值。
?
我们知道数值在内存中都是以二进制的形式存放的,假如我们是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
?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次之后,末尾第一个追加的数字,抵达第一位。
?
-------------------------------------------------------------------------------------------------------
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇组合数计算C(n,m)加取模情况 下一篇位图算法 C语言

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: