简单LinuxC程序之位运算的简单应用

来源:互联网 发布:ubuntu不支持exfat 编辑:程序博客网 时间:2024/06/10 06:51

题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位。

源代码:
#include <stdio.h>int func (int a,int p1,int p2,int flag){//将负数的补码转换为原码if (a < 0 && flag != 0){a -= 1;a = ~a;a = a|0x80000000;     //改变符号位}//printf ("%d\n",a);int n = 0x40000000;int count = 0;n >>= (31 - p2);//printf ("%d\n",n);while (count <= (p2 - p1)){//printf ("%#x\n",n&a);if (n&a)        //判断该位是否为1{printf ("1");}else{printf ("0");}n >>= 1;        //让1一位一位向右移count++;}return 0;}int main(){int a,p1,p2,flag;printf ("input a num(-2147483647~2147483647):");scanf ("%d",&a);printf ("input a p1(1~31):");scanf ("%d",&p1);printf ("input a p2(%d~31):",p1);scanf ("%d",&p2);printf ("选择补码或原码,补码输0,原码输其他:");scanf ("%d",&flag);func(a,p1,p2,flag);printf ("\n");    return 0;}


         解题思路是让该数的每一个二进制位和1与运算,可以判断是否为1。我们可以初始化一个4字节数据,只有第31位是1,每次让这个数右移,就可以对想要操作的数的每一位做与运算。需要注意的是,负数在内存中的存储方式和我们一般使用的表示方法不同,是补码形式存储的,如果想要原码,就要先减1,然后对除符号位的每一位取反(可以先全部取反,再对符号位取反)。