博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二进制运算
阅读量:6879 次
发布时间:2019-06-26

本文共 1304 字,大约阅读时间需要 4 分钟。

参考文章

前提

先认识下 32 位整数!

32 位整数

位31 表示符号位,0 为正数,1 位负数。

根据不同的数据类型占据的内存容量不同,可为 16 位(short)、32位(int)、64位(long)等....,不过最高位始终表示符号位!!

二进制表示

十进制数转换为二进制数:整数部分除N取余数,小数部分乘N取整

原码、反码、补码

原码

  1. 正数:符号位 = 0,二进制
  2. 负数,符号位 = 1,二进制

范例:9-9

9 为正数,符号位为 0,二进制为 1001,所以其原码为:0000 0000 0000 0000 0000 0000 0000 1001

-9 位负数,符号位为 1,二进制表示为 1001,所以其原码为:1000 0000 0000 0000 0000 0000 0000 1001

反码

  1. 正数的反码即原码
  2. 负数的反码,在其原码的基础上,符号位不变,数值位按位取反

范例:9-9

9 为正数,反码即原码,为 0000 0000 0000 0000 0000 0000 0000 1001-9 为负数,符号位为 1,数值位按位取反后为:1111 1111 1111 1111 1111 1111 1111 0110

补码

  1. 正数的补码:原码
  2. 负数的补码:反码 + 1

范例:9-9

9 为正数,补码即原码,为 0000 0000 0000 0000 0000 0000 0000 1001-9 为负数,反码 + 1后得 1111 1111 1111 1111 1111 1111 1111 0111

负数的表示

据上述范例可知,负数以补码形式表达,分步骤得:

  1. 原码
  2. 反码
  3. 补码

原码、反码、补码总结

补码、反码需要先转换成原码后才能获取实际的二进制值,及进行其他进制的转换

二进制运算

加、减、乘、除、乘方等

逢2进1

按位与(&)

1 & 1 = 11 & 0 = 00 & 1 = 00 & 0 = 0

按位或(|)

1 | 1 = 11 | 0 = 10 | 1 = 10 | 0 = 0

按位异或(^)

1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0

按位取反(~)

~1 = 1 的反码

左移(<<)

左移位数不应该超过数值位的长度!例如:int 的数值位长度为 31,所以左移位数应 <= 31!,如果超出,超出部分遵循:高位舍去,低位补0 原则,也不应该 < 0

9 << 5// 9在内存中的表示(补码):0000 0000 0000 0000 0000 0000 0000 1001<< 5,规则:高位舍去,低位补00000 0000 0000 0000 0000 0001 0010 0000换算成 10 进制就是:288

右移(>>)

细节上同左移。

9 >> 5// 9 在内存中的表示(补码)0000 0000 0000 0000 0000 0000 0000 1001>> 5,规则:高位补0或1,根据符号位确定,低位舍去0000 0000 0000 0000 0000 0000 0000 0000换算成 10 进制就是:0

转载地址:http://njgfl.baihongyu.com/

你可能感兴趣的文章
php-fpm进程数优化
查看>>
iOS中如何对具有复杂依赖的SDK在真机上进行单元测试
查看>>
Mobile Web中URL设计问题
查看>>
core Animation之CAAnimationGroup(动画群组)
查看>>
重构实践:体验interface的威力(一)
查看>>
UILabel混合显示动画效果
查看>>
Java内存泄露
查看>>
窥探Swift编程之强大的Switch
查看>>
R语言学习路线图-转帖
查看>>
【导入导出】sqlldr 导入含有内嵌换行符的数据
查看>>
Linux中常用命令
查看>>
RDS最佳实践(四)—如何处理Mysql的子查询
查看>>
最大流:Dinic模板
查看>>
安卓开发中个人能力的进阶进程
查看>>
人工智能10年将有颠覆性改变
查看>>
探秘AOP实现原理
查看>>
单点登录(SSO)简介
查看>>
2018最新大数据学习路线分享
查看>>
利用SVG制作不规矩背景的链接导航
查看>>
Linux - 一次运行多个命令
查看>>