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

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

 #include <stdio.h>

 int main(void)
{
int i = ,a = ; //32位 0000 0000 0000 0000 0000 0000 0000 0010 = 2
int b = a; //另存一份 while (i--)
{
a = a << ;
a &= ~; //~1 = 1111 1111 1111 1111 1111 1111 1111 1110 确保第31位上为0
if (b & ) // 1 = 0000 0000 0000 0000 0000 0000 0000 0001
{
a |= ; //确保第31位上为1
}
b = b >> ;
} printf("%d\n",a); return ;
}

思想:总体思想就是:

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语言整数按照二进制逆序,输出逆序后的整数值的更多相关文章

  1. 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列

    1 逆序输出的数列(10分) 题目内容: 你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束.然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1. 输 ...

  2. c 整数的逆序输出 输入3,2就算 2+22+222的结果

    #include<stdio.h> #include<math.h> //整数逆序输出 void nixu() { int num,i; i = ; scanf("% ...

  3. Java逆序输出整数

    题目要求:编写方法reverseDigit,将一个整数作为参数,并反向返回该数字.例如reverseDigit(123)的值是321.同时编写程序测试此方法. 说明:10的倍数的逆序,均以实际结果为准 ...

  4. 利用C语言判别输入数的位数并正逆序输出

    利用C语言判别用户输入数的位数并正逆序输出 #include <stdio.h> void main() {        int i, scanfNum, printfNum, temp ...

  5. C语言:将字符串中的字符逆序输出,但不改变字符串中的内容。-在main函数中将多次调用fun函数,每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。

    //将字符串中的字符逆序输出,但不改变字符串中的内容. #include <stdio.h> /************found************/ void fun (char ...

  6. C++关于数字逆序输出的两种思路,及字符串逆序输出

    C++关于数字逆序输出的两种思路,及字符串逆序输出 作者:GREATCOFFEE 发布时间:NOVEMBER 15, 2012 分类:编程的艺术 最近在跟女神一起学C++(其实我是不怀好意),然后女神 ...

  7. 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。

    namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...

  8. nyoj 266-字符串逆序输出 (isdigit(), geline(cin, my_string))

    266-字符串逆序输出 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:18 难度:0 题目描述: 给定一行字符,逆序输出此行(空格.数字不输出) 输入描述: 第一行是 ...

  9. 【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)

    如题 动手之前,发现自己很擅长用C语言来写链表. 不过,既然自己做的是Java开发,那么还是用Java实现这个算法吧:毕竟,以后的若干年里都差不多要跟Java打交道了. 于是,先将Java版的链表自学 ...

随机推荐

  1. 查看Linux发行版的名称和版本号

    Method #1: /etc/*-release file 在Terminal中执行命令: cat /etc/*-release 我的输出结果: DISTRIB_ID=Ubuntu DISTRIB_ ...

  2. Mac 下 Scala 平台搭建

    1.先要安装 JDK,下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  3. 《Linear Algebra and Its Applications》-chaper1-线性方程组-线性相关性

    这篇文章主要简单的记录所谓的“线性相关性”. 线性相关性的对象是向量R^n,对于向量方程,如果说x1v1 + x2v2 + …+xmvm = 0(其中xi是常数,vi是向量)有且仅有一个平凡解,那么我 ...

  4. NS CKD

    NS 定义:ALB<30:高脂血症:大量蛋白尿>3.5g:浮肿 见于:肾小球肾炎.小血管炎.微血管血栓性疾病.NSAIDs引起的急性间质性肾炎.不见于肾大血管病.间质性.小管性疾病. 并发 ...

  5. android 反纠结app开发: 在线程中更新view

    大体上想实现一个思路: 对一个view 的内容进行不停地变化, 通过按钮停止这种变化,以达到随机选择的目的. 开发过程中 使用textview 模拟,  建立线程 mythread = new Thr ...

  6. Win7系统安装MySQL5.5.21图解教程

    转自:http://www.jb51.net/article/37310.htm 这篇文章主要介绍了如何在win7中安装mysql,所以加上了MySQL的下载过程,希望对需要的人有所帮助 大家都知道M ...

  7. [转] PostgreSQL学习手册(函数和操作符)

    一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < ...

  8. 在Windows环境中安装并使用kafka

    [TOC] 安装部署 安装部署Java 下载需要安装的软件,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jre8-down ...

  9. Java基础知识强化96:Calendar类之获取任意年份的2月有多少天的案例

    1. 分析: (1)键盘录入任意的年份 (2)设置日历对象的年月日            年:就是(1)输入的数据            月:是2(3月份)            日:是1  (3)把 ...

  10. yii中常用路径<转>

    调用YII框架中jquery:Yii::app()->clientScript->registerCoreScript(‘jquery’); framework/web/js/source ...