• 二进制串的逆转


    二进制串的逆转

     

    Problem Description

    将一个32位整数的二进制表示串的值逆转。如1的二进制表示为:
    0000 0000 0000 0001,逆转之后为1000 0000 0000 0000

    Input

    每行一个32位的整数

    Output

    每行为位逆转后的整数

    Sample Input

    1
    100

    Sample Output

    -2147483648
    637534208

    分析:

    题目的描述还是很清楚的,就是把一个数的32位的二进制字符串倒过来。例如一个数的二进制字符串是1001 1010 1011 1100  1101 1100 0011 1010 带过来就是 0101 1100 0011 1011 0011 1101 0101 1001,我使用的办法就将四个二进制位倒过来,然后送到相应的地方,比如说,最后的1010,我就先把他变成 0101, 然后送到最高位。倒数第二个的0011,我就变成1100,然后送到第二个位置。那么我就是要8个数,去保存这8个 4位 二进制的数既可以了。然后最后判断是不是负数还是正数,分别输出。其中需要注意的是,保存的八个  4位 二进制的数,也是分别保存在相应的位置上面。例如  0101 1100 0011 1011 0011 1101 0101 1001。

    str[7] = 0000 0000 0000 0000 0000 0000 0000 1001

    str[6] = 0000 0000 0000 0000 0000 0000 0101 0000

    str[5] = 0000 0000 0000 0000 0000 1101 0000 0000

    str[4] = 0000 0000 0000 0000 0011 0000 0000 0000

    str[3] = 0000 0000 0000 1011 0000 0000 0000 0000

    str[2] = 0000 0000 0011 0000 0000 0000 0000 0000

    str[1] = 0000 1100 0000 0000 0000 0000 0000 0000

    str[0] = 0101 0000 0000 0000 0000 0000 0000 0000

    如果最后结果是正数,就把上面的全部加起来,如果是负数则是str[7] - str[6]-str[5]-...-str[0],负数的补码性质。

     1 #include<stdio.h>
     2 
     3 void fun (int *p) { 
     4     int a, b, c, d, i;
     5       a = *p & 1;
     6       a = a << 3;
     7       b = *p & 2;
     8       b = b << 1;
     9       c = *p & 4;
    10       c = c >> 1;
    11       d = *p & 8;
    12       d = d >> 3;
    13       *p = a + b + c + d;
    14 }
    15 
    16 int main () { 
    17 
    18     int n, a, b, i, c;
    19     int str[8];
    20     while (scanf("%d",&n) != EOF) { 
    21         a = 15; b = 0; c = 28;
    22         for (i = 0; i < 8; i++) { 
    23         str[i] = n & a;
    24          str[i] = str[i] >> b;
    25          fun (&str[i]);   
    26          str[i] = str[i] << c;
    27          b = b + 4;
    28          c = c - 4;
    29          a = a << 4;
    30     }
    31     if (n % 2 == 0) { 
    32        for (i = 0; i < 7; i++)
    33        str[7] = str[7] + str[i];
    34        printf("%d
    ", str[7]);
    35     } else {
    36        for(i = 0; i < 7; i++)
    37            str[7] = str[7] - str[i];
    38         printf("%d
    ",str[7]);
    39     }
    40     
    41 }
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    AD域撤销域用户管理员权限方案
    域普通用户执行金蝶K/3权限不够解决方法
    redis安装windows+64位
    解决pycharm中no python interpreter configured问题
    python3报错---Error in sitecustomize; set PYTHONVERBOSE for traceback: NameError: name 'reload' is not defined
    python+robot+oracle:执行脚本时中文sql报错:UnicodeEncodeError: 'ascii' codec can't encode
    git-最简单的操作流程
    pycharm配置后执行RF脚本
    性能测试-jmeter基础5-设计数据自动递增
    性能测试-jmeter基础4-设置日期的递增参数demo
  • 原文地址:https://www.cnblogs.com/gznb/p/11213179.html
Copyright © 2020-2023  润新知