`
jubincn
  • 浏览: 242562 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

c++中的左移、右移运算

 
阅读更多

转自:http://blog.csdn.net/hengshan/article/details/6440549


今天在看X264的源代码时,发现里面大量应用了">>"运算符,看书的时候注意过这个细节,不过在工作中一直没有用到,也没记住。重新查了K&R,里面说无符号数的移位总是用0填充,而对于有符号数,"<<"是用0填充的,“>>”则与机器的具体实现有关。如果用0填充,那么这种填充方式称为“logical shift”,若用符号位填充,则称为“arithmetic shift”。在IBM PC汇编里面,好像就有两个汇编指令对应这两个操作。看了下面的这篇文章,作者应该认为X86里基本都是arithmetic shift,结合我手边的代码,我也倾向于这种观点。


移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。

逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。

算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。

c++中,整数分有符号数和无符号数两种,对于这两种数做左移、右移运算,稍有区别:

1、如果是无符号数,不管是左移还是右移都是“逻辑移位”

例如,分别对无符号数 179 做左移、右移操作的结果,

图1 逻辑左移

图2 逻辑右移

2、如果是有符号数,

2a,如果是做左移运算,那么做的是“逻辑移位”,同 1中无符号数的左移。

2b,如果是做右移运算,那么做的是“算术移位”。

例如:

图3 负数的右移

图4 正数的右移

对于当前的大多数c/c++编译器来说,都是按照上面所讲实现的。


分享到:
评论

相关推荐

    字左移和字右移.rar

    例如,在C/C++中,您可以使用`进行左移,使用`&gt;&gt;`进行右移;在Python中,也是同样的符号,而在Java中,左移操作符为`,右移操作符分为逻辑右移`&gt;&gt;&gt;`和算术右移`&gt;&gt;`。 字左移和字右移在实际编程中有着广泛的应用。...

    详解了C++中的模板,位运算,虚函数表 方面的东西

    其次,位运算在计算机科学中扮演着基础角色,C++提供了与位相关的操作符,包括按位与(&),按位或(|),按位异或(^),按位非(~),左移()和右移(&gt;&gt;). 这些运算是底层数据处理的关键,特别是在嵌入式系统和硬件接口编程...

    C++位运算简介

    右移运算(&gt;&gt;) 右移运算符`&gt;&gt;`将操作数的二进制表示向右移动指定的位数,左边空出的位置在无符号数时填充0,在有符号数时填充最左边的原有位(保持符号不变)。 ```cpp #include int main() { int a = -15; /...

    ACM位运算技巧

    本篇文章将深入探讨位运算中的各种技巧及其应用场景。 #### 基础位运算符 - **按位与(&)**:如果两个相应的二进制位都为1,则结果位为1;否则为0。 - 清零特定位:利用掩码中特定位置0,其余位为1,通过`&`操作...

    C++程序设计-运算器.doc

    4. **位运算**:位运算涉及到二进制级别的操作,如按位与(&)、按位或(|)、按位异或(^)、左移()、右移(&gt;&gt;)。这些运算是底层编程和数据处理的重要工具,尤其在处理位掩码和内存管理时。 在实现运算器的过程...

    C++编写128位整数运算源码

    此外,还需要实现比较、左移、右移等基本操作,以及逻辑操作如按位与、按位或和按位异或。 在实际编码中,通常会定义一个结构体或者类来封装这两个64位的整数,并提供相应的成员函数来实现上述运算。这些函数应该...

    c++大数运算的基本思路

    - Half(): 通过逻辑右移运算实现除以2的n次方,注意会丢失余数。 5. **数据输出** 提供ToDecStr()和ToHexStr()成员函数,分别将大数转换为十进制和十六进制字符串进行输出。 6. **异常处理** 为了处理可能的...

    C++位运算与进制转换小工具,方便C、C++学习过程中对位的处理,方便观察十六进制地址的变化

    6.右移运算 二.进制转换: 1.十进制转二进制 2.二进制转十进制 3.二进制+ 4.二进制- 5.十进制转八进制 6.八进制转十进制 7.八进制+ 8.八进制- 9.十进制转十六进制 10.十六进制转十进制 11.十六进制+ 12.十六进制- ...

    c++数据类型、位运算

    ### C++ 数据类型与位运算知识点详解 #### 一、数据类型概述 在 C++ 编程语言中,数据类型是编程的基础之一,用于定义变量能够存储的数据种类和大小。根据给定文件的部分内容,本章节主要介绍了 C++ 的基本数据类型...

    c++位运算c++位运算

    位运算是计算机科学中的一个重要概念,在C++等编程语言中有着广泛的应用。位运算主要针对二进制位进行操作,通过对单个比特位或者比特位组合的操作来实现特定的功能。 #### 二、位的基本概念 在数字电子系统和...

    C与C++位运算封装代码.rar

    下面我们将深入探讨C与C++中的位运算以及如何进行封装。 1. **位运算符** - **按位与(&)**: 对两个数的每个位进行逻辑与操作,只有两个位都为1时,结果位才为1。 - **按位或(|)**: 若两个位中至少有一个为1,则...

    位运算大全

    位运算是在数字的二进制表示上进行的运算,例如与(AND)、或(OR)、非(NOT)、异或(XOR)以及左移(LEFT SHIFT)、右移(RIGHT SHIFT)等。这些运算符对应于逻辑门电路,是计算机硬件的基础。 2. **与(AND)...

    c++中递归知识

    - **右移运算**:将二进制数向右移动指定的位数。 - 应用:除法运算的快速实现。 #### 实际应用示例 - **判断奇偶性**:通过与运算判断一个整数是否为奇数或偶数。 - 例如,`a & 1 == 0`表示偶数,`a & 1 == 1`...

    位运算_C++版.pdf

    位运算在C++编程中是一种高效的操作,它直接作用于整数在内存中的二进制表示,无需转换为十进制。位运算符包括:与(&), 或(|), 异或(^), 取反(~), 左移()和右移(&gt;&gt;). 在这篇关于C++版位运算的文章中,作者将介绍这些...

    位运算学习

    位运算主要涉及对整数在内存中的二进制表示进行直接操作,包括and、or、xor、not以及位移(左移和右移)等操作。这些运算符在C语言和Pascal语言中有不同的表示形式。 1. **and 运算**:and运算符在二进制中用于进行...

    大整数类利用c++实现完成了各项运算

    4. **位操作**:左移、右移、按位与、按位或、按位异或等,这些在处理二进制数据时非常有用。 5. **取模运算**:用于实现大整数除法后的余数计算。 6. **转换操作**:将大整数转换为字符串,以便于显示或保存;...

    c代码-C:位运算(&与、 |或 、^异、 ~取反) 左移和右移(&lt;&lt; >>) 是对二进制进行操作

    在C语言中,位运算是一种基础且强大的编程工具,它允许程序员直接操作变量的二进制表示。位运算符主要有四种类型:与(&)、或(|)、异或(^)和取反(~),以及左移()和右移(&gt;&gt;)操作。下面将详细介绍这些运算符的工作原理...

    位运算.zip

    二进制位运算基于二进制数系统,它包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()和右移(&gt;&gt;)操作。让我们深入探讨这些运算符及其在Android开发中的应用。 1. **按位与(&)**:这个运算符比较两个位,...

Global site tag (gtag.js) - Google Analytics