代码#include "stdio.h"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()
{//leftshiftchar 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));//rightshifta1 = 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<<1 = -2;
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填补
高位左移溢出则舍弃该高位。
计算机中常用补码表示数据:
数据 127,补码和原码一样:0111 1111。
左移一位: 1111 1110   -> 这个补码对应的原码为:1000 0010  对应十进制:-2
左移二位: 1111 1100   -> 这个补码对应的原码为:1000 0100  对应十进制:-4
左移三位: 1111 1000   -> 这个补码对应的原码为:1000 1000  对应十进制:-8
左移四位: 1111 0000   -> 这个补码对应的原码为:1001 0000  对应十进制:-16
左移五位: 1110 0000   -> 这个补码对应的原码为:1010 0000  对应十进制:-32
左移六位: 1100 0000   -> 这个补码对应的原码为:1100 0000  对应十进制:-64
左移七位: 1000 0000   -> 这个补码对应的原码为:1000 0000  对应十进制:-128
左移八位: 0000 0000   -> 这个补码对应的原码为:0000 0000  对应十进制:0
注:
原码到补码的计算方式:取反+1,
补码到原码的计算方式:-1再取反。
数据-1,它的原码为1000 0001,补码为1111 1111
左移一位: 1111 1110   -> 这个补码对应的原码为:1000 0010  对应十进制:-2
左移二位: 1111 1100   -> 这个补码对应的原码为:1000 0100  对应十进制:-4
左移三位: 1111 1000   -> 这个补码对应的原码为:1000 1000  对应十进制:-8
左移四位: 1111 0000   -> 这个补码对应的原码为:1001 0000  对应十进制:-16
左移五位: 1110 0000   -> 这个补码对应的原码为:1010 0000  对应十进制:-32
左移六位: 1100 0000   -> 这个补码对应的原码为:1100 0000  对应十进制:-64
左移七位: 1000 0000   -> 这个补码对应的原码为:1000 0000  对应十进制:-128
左移八位: 0000 0000   -> 这个补码对应的原码为:0000 0000  对应十进制:0
可以看出127和-1的结果完全一样。移位操作与正负数无关,它只是忠实的将所有位进行移动,补0,舍弃操作。
右移操作(>>)
规则:

左边空出的位用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

常见应用
左移相当于*2,只是要注意边界问题。如char a = 65; a<<1 按照*2来算为130;但有符号char的取值范围-128~127,已经越界,多超出了3个数值,所以从-128算起的第三个数值-126才是a<<1的正确结果。
而右移相当于除以2,只是要注意移位比较多的时候结果会趋近去一个非常小的数,如上面结果中的-1,0。
其它的四种位运算:
与运算(&)
1、与0相与可清零
2、与1相与可保留原值
或运算(|)
1、与0相或可保留原值
2、与1相与可齐设1
异或运算(^)
1、与0异或保留原值
2、与1异或比特值反转
3、可通过某种算法,使用异或实现交换两个值
异或运算是有结合律的
取反(~)

转载地址:http://www.cnblogs.com/yyangblog/archive/2011/01/14/1935656.html

位运算——左移右移运算详解相关推荐

  1. java 左移 返回值_java左移右移运算符详解

    在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号在Java中叫移位运算符,在写代码的过程中,虽然我们基本上不会去写这些符号,但需要明白这些 ...

  2. c语言左移右移运算符详解

    对于负数的右移:因为负数在内存中是以补码形式存在的,所以首先根据负数的原码求出负数的补码(符号位不变,其余位按照原码取反加1),然后保证符号位不变,其余位向右移动到X位,在移动的过程中,高位补1.等移 ...

  3. 二进制位运算---左移右移

    二进制位运算---左移(<<)右移(>>) (1).二进制中负数的计算 负数以正数的补码表示 原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反 ...

  4. Twitter-Snowflake,64位自增ID算法详解

    Twitter-Snowflake,64位自增ID算法详解 from: http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8 ...

  5. 位运算之左移右移运算之详解

    先看如下一段左移右移的代码及其结果: 代码 #include "stdio.h" char leftshift(char i, int n) { if(n < 0) retu ...

  6. 位运算和典型应用详解

    位运算的符号 与运算:& 或运算:| 异或运算:^ 非运算:~ 移位运算:>>和<< 一. 逻辑运算符 1. & 位与运算 1) 运算规则 位与运算的实质是将参 ...

  7. mysql 与运算_MySQL常用运算符详解

    MySQL 数据库中的表结构确立后,表中的数据代表的意义就已经确定.而通过 MySQL 运算符进行运算,就可以获取到表结构以外的另一种数据. 例如,学生表中存在一个 birth 字段,这个字段表示学生 ...

  8. C语言之负数的左移/右移运算

    文章目录 前言 一.针对负数的左移运算 二.针对负数的右移运算 前言 在实际上的开发中,很少碰到针对负数的移位操作,基本上都是无符号整数即unsigned int类型.但有时候在笔试或者面试中,有可能 ...

  9. c语言无符号整型右移,c语言 java 有符号数,无符号数. 左移,右移运算

    1: c语言区分有符号数,无符号数.有符号数是符号位在首位,无符号数首位就是普通位数. java只有有符号数,换句话说java二进制中首位都是符号位.0正1负. 2: 左移在所有语言中只是左移,不存在 ...

最新文章

  1. Swift 开源带来的思考
  2. ASP.NET基础教程-DataView对象的属性、方法、枚举成员
  3. 【网络安全】Windows恶意软件BazarLoader分析
  4. MySQL学习第三章练习题
  5. python自建模块导入_Python模块的使用及自建模块的导入方法举例
  6. Python传奇:30年崛起之路
  7. VSCode 1.35 发布,新的图标,支持远程开发
  8. vmware 多外网ip
  9. 微型计算机硬件设计内容,《认识微机硬件》教学设计.pdf
  10. 计算机终端保密检查系统使用教程,博智计算机终端保密检查系统
  11. CGAL:Win10 + VS2017 编译 CGAL 5.2
  12. 10计算机语言代表什么,win10是什么编程语言写的_win10史诗般的巨型编程项目
  13. 两轮电自2.0时代开启 小牛电动以独立主见创造新物种
  14. Winfrom窗体应用程序图标的改变
  15. RT201 国产PA射频功率放大器 兼容RFX2401C
  16. LA@determinant@行列式@Vandermonde行列式
  17. 电子邮件发错了怎么撤回?原来邮件误发也有“后悔药”
  18. Oracle序列的概念、创建和使用
  19. Excel导入导出详细教程------EasyExcel功能整合
  20. Python爬虫爬取东方财富网的股票信息

热门文章

  1. [程序员学英语]英语发音规则
  2. 三国论(21-25章)
  3. 中北大学计算机应用基础课后答案,中北大学计算机与控制工程学院研究生导师介绍:秦品乐...
  4. compareAndSet
  5. 【愚公系列】2021年12月 Redis数据库-主从的搭建
  6. 给FLASH加链接的方法
  7. EclipseSVN更新和提交
  8. Linux下的网络配置
  9. python爬虫精选11集(selenium进阶总结【selenium的cookies处理、ip代理、useragent替换】)
  10. 人脸识别门禁项目总结(STM32部分)