位运算之左移右移运算之详解
先看如下一段左移右移的代码及其结果:
char leftshift(char i, int n)
{
if(n < 0)
return -1;
return i<<n;
}
char rightshift(char i, int n)
{
if(n < 0)
return -1;
return i>>n;
}
int main()
{
//leftshift
char a1 = 127;
char a2 = -1;
for(int i = 1; i <= 8; i++)
printf("%d<<%d = %d;\n", a1, i, leftshift(a1,i));
for(i = 1; i <= 8; i++)
printf("%d<<%d = %d;\n", a2, i, leftshift(a2,i));
//rightshift
a1 = 127;
a2 = -128;
for(i = 1; i <= 8; i++)
printf("%d>>%d = %d;\n", a1, i, rightshift(a1,i));
for(i = 1; i <= 8; i++)
printf("%d>>%d = %d;\n", a2, i, rightshift(a2,i));
return 0;
}
结果为:
127<<2 = -4;
127<<3 = -8;
127<<4 = -16;
127<<5 = -32;
127<<6 = -64;
127<<7 = -128;
127<<8 = 0;
-1<<1 = -2;
-1<<2 = -4;
-1<<3 = -8;
-1<<4 = -16;
-1<<5 = -32;
-1<<6 = -64;
-1<<7 = -128;
-1<<8 = 0;
127>>1 = 63;
127>>2 = 31;
127>>3 = 15;
127>>4 = 7;
127>>5 = 3;
127>>6 = 1;
127>>7 = 0;
127>>8 = 0;
-128>>1 = -64;
-128>>2 = -32;
-128>>3 = -16;
-128>>4 = -8;
-128>>5 = -4;
-128>>6 = -2;
-128>>7 = -1;
-128>>8 = -1;
左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;
低位右移溢出则舍弃该位。
1、127的补码:0111 1111
右移一位: 0011 1111 -> 原码同补码一样 对应十进制:63
右移二位: 0001 1111 -> 原码同补码一样 对应十进制:31
右移三位: 0000 1111 -> 原码同补码一样 对应十进制:15
右移四位: 0000 0111 -> 原码同补码一样 对应十进制:7
右移五位: 0000 0011 -> 原码同补码一样 对应十进制:3
右移六位: 0000 0001 -> 原码同补码一样 对应十进制:1
右移七位: 0000 0000 -> 原码同补码一样 对应十进制:0
右移八位: 0000 0000 -> 原码同补码一样 对应十进制:0
2、-128的补码:1000 0000
右移一位: 1100 0000 -> 这个补码对应的原码为:1100 0000 对应十进制:-64
右移二位: 1110 0000 -> 这个补码对应的原码为:1010 0000 对应十进制:-32
右移三位: 1111 0000 -> 这个补码对应的原码为:1001 0000 对应十进制:-16
右移四位: 1111 1000 -> 这个补码对应的原码为:1000 1000 对应十进制:-8
右移五位: 1111 1100 -> 这个补码对应的原码为:1000 0100 对应十进制:-4
右移六位: 1111 1110 -> 这个补码对应的原码为:1000 0010 对应十进制:-2
右移七位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1
右移八位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1
转载于:https://www.cnblogs.com/yyangblog/archive/2011/01/14/1935656.html
位运算之左移右移运算之详解相关推荐
- 单片机“左移右移理论”,详解
先解释C语言的左移右移 int c=3<<2;//"左移.右移理论",001<<1,是全部都往左移一位,也就是变成了0010,所以101<<2变 ...
- php中左移和右移,c语言左移和右移的示例详解
逻辑移位,简单理解就是物理上按位进行的左右移动,两头用0进行补充,不关心数值的符号问题. 算术移位,同样也是物理上按位进行的左右移动,两头用0进行补充,但必须确保符号位不改变. 算术移位指令 算术移位 ...
- C语言向右移三个字母怎么做,c语言左移和右移的示例详解
逻辑移位,简单理解就是物理上按位进行的左右移动,两头用0进行补充,不关心数值的符号问题. 算术移位,同样也是物理上按位进行的左右移动,两头用0进行补充,但必须确保符号位不改变. 算术移位指令 算术移位 ...
- [Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- c语言将两个16位变为一个32位,16位汇编第六讲汇编指令详解第第三讲(示例代码)...
16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时 ...
- C语言之负数的左移/右移运算
文章目录 前言 一.针对负数的左移运算 二.针对负数的右移运算 前言 在实际上的开发中,很少碰到针对负数的移位操作,基本上都是无符号整数即unsigned int类型.但有时候在笔试或者面试中,有可能 ...
- c语言无符号整型右移,c语言 java 有符号数,无符号数. 左移,右移运算
1: c语言区分有符号数,无符号数.有符号数是符号位在首位,无符号数首位就是普通位数. java只有有符号数,换句话说java二进制中首位都是符号位.0正1负. 2: 左移在所有语言中只是左移,不存在 ...
- 位运算符之---左移右移运算符(简单易懂)
前言: 位运算符是用来对二进制位进行操作的 c语言中有6种位运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/det ...
- 位运算符之左移右移(简单易懂)
前言: 位运算符是用来对二进制位进行操作的 c语言中有6种位运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/det ...
最新文章
- c#百度排名点击器编写 及webser 填表.
- 用localStorage实现登录时记住密码的功能
- sympy随笔-python符号计算
- 北交的计算机和北理,北航与北理
- 【BZOJ3772】精神污染
- Spark的Transformations算子(理解+实例)
- linux 多块磁盘挂一个文件夹,Linux单目录挂载多块磁盘
- 只返回数据表的部分字段(不建类)
- java获取中文拼音首字母
- window命令行启动Mysql并安装服务
- SQL注射技术总结文档
- MySQL卸载不干净问题,connector net卸不掉
- 【转载】Synopsys 推荐的 UPF 流程简介
- C#用Socket和S7.net实现安卓手机APP读写西门子PLC数据(安卓APP使用的E4A中文编程软件)
- 小米笔试题(句子反转)
- 设计一个形状类(接口)Shape,方法:求周长和求面积
- 微信小程序实现预览图片
- 2018 Multi-University Training Contest 1 部分简单题解析
- 【论文阅读 Journal of Financial Economics】Surprise election for Trump connections
- spring集成druid示例
热门文章
- 操作 Wave 文件(13): waveOutGetVolume、waveOutSetVolume
- HTTP404错误原因
- Thunk函数的使用
- arm linux 时间获取,菜鸟自学ARM:linux下编程获取系统时间和设置时间
- DevOps vs Agile:有什么区别?
- emacs org 日历_发送电子邮件并使用Emacs检查您的日历
- 哪种编程语言好找工作_哪种编程语言可以工作? 为了周末?
- apache 2许可证_如何理解Apache 2专利许可
- swift ... .._Swift 2.0是开源的,ApacheCon:大数据,还有更多开源新闻
- jQuery源码分析 Callbacks