• 移运算符 << :把一个数的所有位都向左移动若干位
int i = 1;
i = i << 2; //把i里的值左移2位

为了理解方便,假设 int 占1个字节(8位,实际32位机器占4字节,32位)

i = 0000 0100
i = i << 2 ;
//结果 i = 0001 0000

此时需要注意的是 int 类型 最左端的符号位
0 表示
1 表示

i = 0100 0000 //十进制为64  111 1111:127   1000 0000:128
i = i << 1 ;  //变为i = 1000 0000 即十进制为-128 变成了最小数
这里是不是一脸问号???接下来解释为什么
计算机中以补码的形式存储数据/*
正数补码 = 原码
负数补码 = 原码取反+1
*/-1 原码为1000 0000  0000 0000  0000 0000  0000 0001
-1 反码为1111 1111  1111 1111  1111 1111  1111 1110
-1 补码为1111 1111  1111 1111  1111 1111  1111 1111所以最小的负数是-2147483647吗?错,不是。在二进制中,0有两种表方法。
+0 原码为0000 0000  0000 0000  0000 0000  0000 0000
-0 原码为1000 0000  0000 0000  0000 0000  0000 0000
因为0 只需要一个,所以把-0拿来当做一个最小的数-2147483648
这也就是为什么负数比正数多一个的原因(int 范围-2^31 ~ 2^31-1)-2147483648 的补码表示为1000 0000  0000 0000  0000 0000  0000 0000 在32位没有原码注意,这个补码并不是真正的补码,真正的补码是1  1000 0000  0000 0000  0000 0000  0000 0000 溢出所以在这里只占1个字节带符号的int的最小值为-128 即 0100 0000 << 1 = 1000 0000 (即-128)

当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1 //设int占1个字节,即8位 i = 1:0000 0001
i = i << 9;
// 9 % 8 = 1 即此时左移1位 i = 2 :0000 0010
int i = 64 //设int占1个字节,即8位 i = 1:0100 0000
i = i << 9;
// 9 % 8 = 1 即此时左移1位 i = 0 :1000 0000 最高位被丢弃

总结:丢弃高位,0补低位

  • 移运算符 >> :把一个数的所有位都向左移动若干位

符号位向右移动后,正数补0负数补1,也就是汇编语言中的算术右移,同样当移动的位数超过类型的长度时,会取余数,余数是几,移动几位

整型 int 为4个字节32位,那么当我们右移32位会发生什么?35位呢?

原数: 2147483647 (整型最大值)
二进制: 01111111 11111111 11111111 11111111
结果不变

这是因为位移是一个取模的过程
当我们右移4位:4 % 32 = 4
当我们右移32位:32 % 32 = 0 也就是不动
那么当右移33位,那不就是右移1位吗!

  • 无符号右移(没有无符号左移)

无符号右移在右移时,高位补0,也就是不会管你是不是负数
-10 >>> 1
二进制: 01111111 11111111 11111111 11111011 | 0
是这样吗?答案是对的,负数无符号右移,高位同样补0
无符号右移1位后最高位的1变为了0,负数变为了正数

总结
负数右移高位补1
无符号负数高位补0

eg 小测验:

原数: 75
二进制: 00000000 00000000 00000000 01001011
请问 左移25位结果是?
10010110 00000000 00000000 00000000
-1778384896
  • 总结
码制 添补代码
正数 原码、补码、反码 0
负数 原码 0
补码 左移添0
右移添1
反码 1

一次搞懂:正数 负数 左移<< 右移>> 移位运算规则 移位后的空位添补规则相关推荐

  1. c语言负数左移右移_C语言左移和右移

    事情的发生: 某日工作中有个需求是将不同的数值存到char的前4位和后4位中. 恰好同事中有同样取得32位int的前8位当成一个数值的代码: //取得32位中的高八位组成的值 #define U32_ ...

  2. c语言右移高位如何补1,c语言负数左移右移

    事情的发生: 某日工作中有个需求是将不同的数值存到char的前4位和后4位中. 恰好同事中有同样取得32位int的前8位当成一个数值的代码: //取得32位中的高八位组成的值 #define U32_ ...

  3. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  4. c语言负数左移右移_C语言中关于循环左移和循环右移

    昨天在解答同学的问题中,又接触了好久没碰的C中的位操作.在重接触的过程中,又理解了一遍计算机存储数据的细节,于是分享给大家看一下. 让我们先看一下题目:编写一个程序,输入两个整数i.j,如果j的值大于 ...

  5. c语言负数左移右移_C语言里的左移和右移运算

    C语言里的左移和右移运算 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用运算符.例如:int i = 1;i = i 2; /把i里的值左移2位也就是说,1的2进制是000.0001(这 ...

  6. c语言负数左移右移_C语言 位运算符的运算规则

    位运算是指按照二进制进行的运算,在C语言中,提供了6种的位运算符,他们分别是按位与(&),按位或(|),按位异或(^),按位取反(-),左移(<)和右移(>).这些运算符只能用整型 ...

  7. c语言负数左移右移_C语言位运算符:与、或、异或、取反、左移和右移!

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

  8. 你真的搞懂了负数取模吗?

    如果现在给你出下面这道面试题,你能答出来吗? -7 % 3 = ? 那这个呢? 7 % (-3) = ? 正整数的取模大家应该玩的很溜了,(什么,正数的都不会,那自己去谷歌吧,百度也行.) 对于负数呢 ...

  9. 网络知识扫盲,一文搞懂 DNS

    在找工作面试的过程中,面试官非常喜欢考察基础知识,除了数据结构与算法之外,网络知识也是一个非常重要的考察对象. 而网络知识,通常是很抽象,不容易理解的,有很多同学就在这里裁了跟头.为了更好地通过面试, ...

最新文章

  1. js(javascript)与OC(Objective-C)交互
  2. html打开显示脚本错误,IE浏览器显示脚本错误怎么解决?IE浏览器脚本错误解决方法图文教程介绍...
  3. Android 多状态加载布局的开发 Tips
  4. LevelDB 之 arena
  5. 【Codeforces - 798C】 Mike and gcd problem(思维,贪心)
  6. 【Vegas原创】GridView跨页选择多行数据,并循环添加一行DataSet数据
  7. UVALive3905 流星
  8. html5——3D转换
  9. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结
  10. Win10系统安装Ubuntu系统
  11. iOS MAC抓包工具charles(青花瓷)配置教程
  12. ps6人脸识别液化工具在哪_Photoshop教学:人脸识别液化功能介绍
  13. 《线粒体疾病的遗传》学习笔记
  14. 假设检验之单个总体均值检验(含Python代码)
  15. 速达开发版ERP移动端 App 操作使用说明
  16. ERP实施-有色金属-铜冶炼
  17. SpringWeb项目Maven执行clean命令后编译拒绝访问的解决方法
  18. 冰羚 example-icedelivery-README.md翻译
  19. 力扣LeetCode-哈希表
  20. 金融相关时间序列分析全指南

热门文章

  1. 我是一个搞IT的农民工
  2. 做IT精英还是IT民工?
  3. 分析程序员为什么单身
  4. 如何使用MD5加密解密工具?
  5. 不要虚荣心太强,要踏实肯干
  6. 【从零开始JavaEE课设】《影院系统》成品展示——主页面
  7. MIRO BAPI_INCOMINGINVOICE_CREATE1 报错 MRM_INVOICE_TAXES_SAVE
  8. web自动化学习之selenium安装喝浏览器驱动和元素定位
  9. Java选择题(六)
  10. linux一键安装包 制作,linux一键安装包