zoukankan      html  css  js  c++  java
  • 关于正负数的二进制新发现以及求法

    在做蓝桥杯真题的时候发现了一种求二进制的很厉害的求法,先看代码,i表示二进制数。

     1 void toBinaryStr(int i, string &ans)
     2 {
     3     if(i >= 0)
     4     {
     5         ans[0] = '0';
     6         for(int j = 0; j < 7; j++)
     7         {
     8             if(((i >> j) & 1) == 1)
     9             {
    10                 ans[8 - j - 1] = '1';
    11             }
    12         }
    13     }
    14     else
    15     {
    16         ans[0] = '1';
    17         for(int j = 0; j < 7; j++)
    18         {
    19             if((((128+i) >> j) & 1) == 1)  //八位二进制表示的范围是(-128~127)
    20             {
    21                 ans[8 - j - 1] = '1';
    22             }
    23         }
    24     }
    25 
    26 }

    对于正数的二进制,高位一定是0(string从左往右依次表示高位到低位),因为正的二进制数以八位为例,最大表示为127,二进制就是01111111. 代码中 ((i >> j) & 1) == 1 意思是取i的第j个二进制位是否是一从而可以直接给string数组 ans 直接赋值。

    对于负数的二进制,高位一定是1,因为八位所能表示最小二进制数是-128,即11111111,所以 (((128+i) >> j) & 1) == 1 ,这就相当于对i取模,让i加128变为正,为什么这样呢?

    举个例子:127的二进制是011111111,而-1的二进制是什么呢,首先变为+1,二进制为00000001,按位取反11111110,加一11111111,所以看-1的后边七个低位,与127的七个低位一样,都是11111111,所以我们就可以直接把负数的高位赋值为1然后索引(i+128)的二进制的七个低位即可。

  • 相关阅读:
    BZOJ1143: [CTSC2008]祭祀river
    接口自动化测试平台-接入持续集成jenkins
    mac OS npm 安装/卸载失败 权限问题解决方案
    初入React源码(一)
    初入React源码(一)
    mac OS git关联github
    重识TCP/IP协议族与HTTP基础
    重识TCP/IP协议族与HTTP基础
    Visual Studio Code mac OS 安装 中文简体语言包
    C#加密类
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12768861.html
Copyright © 2011-2022 走看看