C语言之移位操作
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语言之移位操作的更多相关文章
- C语言中 移位操作运算
移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...
- C语言零移位操作
给定一个整形数组要求把其中的零元素移动到数组的末尾 非零元顺序保持不变 以下采用两种方法实现 #include <stdlib.h> #include <stdio.h> #i ...
- Linux-Big-Endian和Little-Endian转换
转自:http://blog.csdn.net/aklixiaoyao/article/details/7548860 在各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机通信领 ...
- 大端小端(Big- Endian和Little-Endian)[转]
原文出处: 字节序(Endian),大端(Big-Endian),小端(Little-Endian) http://www.cppblog.com/tx7do/archive/2009/01/06/ ...
- ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kingmax54212008/arti ...
- c语言移位操作
应该先看看C语言是指所有的位二进制算术位计算.即使输入的是十进制的数,在存储器存储为二进制形式. “<<”使用方法: 的格式是:a<<m,a和m式,要求m>=0. 功能: ...
- c语言中的位移位操作
先要了解一下C语言里所有的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<<”用法: 格式是:a<<m,a和m必须是整型表达式,要求m ...
- C语言的数据类型
复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量 1字节(8Bit) short 短整型 2字节(16Bit) i ...
- C语言 位操作
c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...
随机推荐
- DevSecOps 简介(一)
DevOps,或者说企业应用开发团队和系统运营团队的合作,已经成为一个时髦的 IT 话题.这一新的运营模式往往与敏捷式软件开发方法并举,同时还会利用云计算的可扩展性--这一切,都是为了使企业更加灵活, ...
- 解决JS文件页面加载时的阻塞
关于页面加载时的时间消费,许多书中都做出了介绍,也提出了很多种方法.本文章就详细介绍XHR注入. 概述:JS分拆的方法 1.XHR注入:就是用ajax异步请求同域包含脚本的文件,然后将返回的字符串转化 ...
- 2014多校第十场1004 || HDU 4974 A simple water problem
题目链接 题意 : n支队伍,每场两个队伍表演,有可能两个队伍都得一分,也可能其中一个队伍一分,也可能都是0分,每个队伍将参加的场次得到的分数加起来,给你每个队伍最终得分,让你计算至少表演了几场. 思 ...
- lintcode:最小编辑距离
最小编辑距离 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 样例 给出 work1=&quo ...
- 构建高性能web之路------mysql读写分离实战
http://blog.csdn.net/cutesource/article/details/5710645 http://www.jb51.net/article/38953.htm http:/ ...
- JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<delimited-identifiers/>、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)
一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { / ...
- sin=in.readLine();
import java.io.*; public class LineIO{ public static void main(String[] args) { String sin,inputStri ...
- POSIX、XNU
POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEE ...
- Linux系统VIM编辑器
vim,linux系统中一款超好用的文本编辑器,是vi的升级版. 三种操作模式 命令模式: 控制光标移动,可对文本进行删除.恢复.黏贴等工作 输入模式: 正常的文本录入 末行模式: 保存,退出与设置编 ...
- 笔者带你剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)
注:本文部分内容引用本人博客http://gao-xianglong.iteye.com/blog/1973591 前言 在开始讲解淘宝的TDDL(Taobao Distribute Data L ...