关于正负数的二进制新发现以及求法
在做蓝桥杯真题的时候发现了一种求二进制的很厉害的求法,先看代码,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)的二进制的七个低位即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端