C语言很多操作都是以字节为单位进行的,但有时为了节约空间,很多系统程序中要求在比特位级别进行运算处理。C语言一同提供了六种位运算的运算符,分别为&(按位与),|(按位或),~(按位取反),^(按位异或),<<(左移),>>(右移)。本次我们就进行移位操作的分析,看看在不同情况下移位操作的情形。

(1)变量为正数的情形

当变量为正数的时候,无论左移还是右移,移动溢出的位丢弃,剩下的位补的都是0。

1.当移位的位数大于,0,并且小于所定义的类型的位数(如变量为整型,那他移位的范围在0~32之间)(左移和右移)

按照正常的情况处理,即将变量的二进制位移动相应的位数,然后在空出来的位上补零即可。

2。当移位的位数大于0,并且超出了所定义类型的位数(左移和右移)

将所移动的位数除以32取得的余数即为移位的位数,按照步骤一执行。

(2)变量为负数的情形

1.右移正数位,且右移位数小于所定义类型的位数        负数的右移与正数的右移规则一样,唯一不同的是正数右移左边补得是0,而负数右移左边补的是1,即符号(传说中的符号移位)。由于是负数,在计算机中以补码存储,即二进制的原码取反加1.然后以移位规则进行移位。即将所求的的补码向右移动相应的位数,左边空出来的位都用1来补齐。然后将这个补码的结果还原成原码即为所求。

2.右移正数位,并且右移的位数大于所定义类型的位数

将所移动的位数除以32所取得的余数即为移位的位数,然后操作上面1.的过程。

3.左移正数位(移动位数小于所定义类型的位数,移动位数大于所定义类型的位数)

负数左移与正数左移一样,左移右边补0.区别是,负数在计算机中以补码存在。一味地过程是对负数求补码,进行移位后,再将补码结果还原成原码即为所求。

(3)移动的位数为负时

1.右移负位数(移动位数的绝对值小于所定义类型的位数)

右移负数位,实则是向相同的方向移动所定义类型的位数与所移动位数的绝对值之差,如果右移-31位,即32-|-31|=1,相当于右移了1位。只要知道如何将其移动的负数位转化为相应移动的整数位后,就可以按照相应的移位步骤进行移位了。

2.右移负数位(移动位数的绝对值大于所定义类型的位数)

一旦右移负数位的绝对值超过所定义类型的位数时,要将其进行取模,把范围控制在所定义的类型位数之内,如果右移-33位,即|-33|%32=1,相当于右移-1位,根据上面的讲解,右移-1位就是右移31位。

3.左移负数位

同上面1,2。

一个小技巧:value(value不能是负数)向右移动n(n小于所定义类型位数)位,其结果等于value/2^n,value向左移动n(n小于所定义类型的位数)位,其结果等于value*2^n.

C语言之移位操作的更多相关文章

  1. C语言中 移位操作运算

    移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...

  2. C语言零移位操作

    给定一个整形数组要求把其中的零元素移动到数组的末尾 非零元顺序保持不变 以下采用两种方法实现 #include <stdlib.h> #include <stdio.h> #i ...

  3. Linux-Big-Endian和Little-Endian转换

    转自:http://blog.csdn.net/aklixiaoyao/article/details/7548860 在各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机通信领 ...

  4. 大端小端(Big- Endian和Little-Endian)[转]

    原文出处: 字节序(Endian),大端(Big-Endian),小端(Little-Endian)  http://www.cppblog.com/tx7do/archive/2009/01/06/ ...

  5. ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kingmax54212008/arti ...

  6. c语言移位操作

    应该先看看C语言是指所有的位二进制算术位计算.即使输入的是十进制的数,在存储器存储为二进制形式. “<<”使用方法: 的格式是:a<<m,a和m式,要求m>=0. 功能: ...

  7. c语言中的位移位操作

    先要了解一下C语言里所有的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<<”用法: 格式是:a<<m,a和m必须是整型表达式,要求m ...

  8. C语言的数据类型

    复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量   1字节(8Bit) short 短整型      2字节(16Bit) i ...

  9. C语言 位操作

    c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...

随机推荐

  1. 自动化 测试框架部署(python3+selenium2)

    安装Python 从https://www.python.org/downloads/下载最新版本的Python3,请注意,是3: 需要将Python的安装目录和安装目录下的Scripts文件夹添加到 ...

  2. linux下修改history命令保存条数

    在linux系统下.history命令会保存多少条命令呢?曾在一本书上说,如果注销系统,那么会将所有的历史命令都定入到~/.bash_history, 但只保留1000条命令(这个是由默认的shell ...

  3. oracle 密码忘记 找回密码

    生活中,容易忘记Oracle数据库system用户的密码,怎么办呢,小生带你一步步重新登上Oracle ,及时你密码忘记了. 1.打开cmd窗口,输入 sqlplus / as sysdba 2.运行 ...

  4. 【HDU 5030】Rabbit's String (二分+后缀数组)

    Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...

  5. 李洪强经典iOS面试题11

        #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别? #import是Objective-C导入头文件的关键字, ...

  6. 【转】SIP初步

    1.什么是SIP SIP(会话发起协议)属于IP应用层协议,用于在IP网上为用户提供会话应用.会话(Session)指两方或多方用户之间的语音.视频.及其他媒体形式的通信,具体可能是IP电话.会议.即 ...

  7. SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-004-使用NamedParameterJdbcTemplate

    为了使查询数据库时,可以使用命名参数,则要用NamedParameterJdbcTemplate 1.Java文件配置 @Bean public NamedParameterJdbcTemplate ...

  8. 创业者拿到融资别高兴太早,当心TS中的优先清算权

    最近创投圈的新闻读起来真是让人有些绝望啊,一家家创业公司接连宣告倒闭,其中不乏一些走在比较后面的“明星企业”,冷不丁冒出点消息,却是创始人发的公告,宣布公司资金链断裂,进入破产清算程序,或被低价并购. ...

  9. (转)javaScript插件开发

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  10. 314. Binary Tree Vertical Order Traversal

    题目: Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to ...