C语言整数按照二进制逆序,输出逆序后的整数值
2014-08-15 20:59
471 查看
问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值。
我们知道数值在内存中都是以二进制的形式存放的,假如我们是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)首先使a,b的值相等;
2)然后,每次从b尾部取出一位(从第32位一直取到第0位,用i循环控制);注意:b = b >> 1,b一直在右移,以确保每次取出其最后一位。
3)最后,将其追加在a的末尾。注意:a = a << 1,a一直在左移,以确保循环32次之后,末尾第一个追加的数字,抵达第一位。
-------------------------------------------------------------------------------------------------------
原文地址:/article/5407749.html
我们知道数值在内存中都是以二进制的形式存放的,假如我们是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 = 32,a = 2; //32位 0000 0000 0000 0000 0000 0000 0000 0010 = 2 int b = a; //另存一份 while (i--) { a = a << 1; a &= ~1; //~1 = 1111 1111 1111 1111 1111 1111 1111 1110 确保第31位上为0 if (b & 1) // 1 = 0000 0000 0000 0000 0000 0000 0000 0001 { a |= 1; //确保第31位上为1 } b = b >> 1; } printf("%d\n",a); return 0; }
思想:总体思想就是:
1)首先使a,b的值相等;
2)然后,每次从b尾部取出一位(从第32位一直取到第0位,用i循环控制);注意:b = b >> 1,b一直在右移,以确保每次取出其最后一位。
3)最后,将其追加在a的末尾。注意:a = a << 1,a一直在左移,以确保循环32次之后,末尾第一个追加的数字,抵达第一位。
-------------------------------------------------------------------------------------------------------
原文地址:/article/5407749.html
相关文章推荐
- C语言整数十进制按照二进制形式输出程序
- 【C语言】输入一个不多于5位的正整数,要求:(1)输出它是几位数,(2)按逆序输出各位数字,(3)按顺序输出各位数字
- 【C语言小练习】按照下列正方形矩阵的规律,输出下列正方形矩阵。边长为正整数,可以在源代码里更改。
- (c语言)输入一个整数,将其逆序输出
- C语言:编写函数将一个整数的二进制位模式从左到右翻转后的值输出
- C语言递归算法系列_循环实现逆序和正序输出一个整数的每位数 (2)
- C语言 将一个整数的二进制序列分别输出
- C语言整数的二进制偶数位,奇数位和二进制序列的输出
- C语言中以二进制形式输出整数
- 黑马程序员——【C语言】输出整数在内存中的二进制形式
- C语言—正序,逆序输出任意整数的每一个数字
- 【c语言】给一个不多于5位的正整数,要求: 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字
- C语言:用递归实现将输入的整数按逆序输出。如输入12345,则输出54321。
- C语言递归算法系列_ 逆序和正序输出一个整数的每位数 (1)
- C语言位段操作,写一个程序,从键盘上接收一个整数,用二进制形式输出这个整数
- C语言:编写函数将一个整数的二进制位模式从左到右翻转后的值输出
- 输出整数二进制逆序对应的整数
- 【c语言】将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数
- 从屏幕输入 x y z 三个整数,按照由小到大的顺序输出它们
- C语言将字节输出为十六进制、八进制和二进制