美文网首页
C 语言中的移位运算

C 语言中的移位运算

作者: Sun东辉 | 来源:发表于2022-08-16 19:13 被阅读0次

C 语言还提供了一组移位运算,向左或者向右移动位模式。对于一个位表示为 [x_{w-1},x_{w-2},...,x_0]的操作数 x,C 表达式 x<<k 会生成一个值,其位表示为 [x_{w-k-1},x_{w-k-2},...,x_0,0,...,0] 。也就是说, x 向左移动 k 位,丢弃最高的 k 位,并在右端补 k 个 0。移位量应该是一个 0~w-1 之间的值。移位运算是从左至右可结合的,所以 x<<j<<k 等价于 (x<<j)<<k。

有一个相应的右移运算 x>>k,但是它的行为有点微妙 。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补 k 个 0,得到的结果是 [0,...,0,x_{w-1},x_{w-2},...,x_k] 。算术右移是在左端补 k 个最高有效位的值,得到的结果是[x_{w-1},...,x_{w-1},x_{w-1},x_{w-2},...,x_k] 。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。

让我们来看一个例子,下面的表给出了对一个 8 位参数 x 的两个不同的值做不同的移位操作得到的结果:

操作
参数 x [0110 0011] [1001 0101]
x << 4 [0011 0000] [0101 0000]
x >>> 4 (逻辑右移) [0000 0110] [0000 1001]
x >> 4 (算术右移) [0000 0110] [1111 1001]

斜体的数字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了一个条目之外,其他的都包含填充 0,唯一的例外是算术右移 [1001 0101] 的情况。因为操作数的最高位是 1,填充的值就是 1。

C 语言标准并没有明确定义对于有符号数应该使用哪种类型的右移——算术右移或者逻辑右移都可以 不幸地,这就意味着任何假设一种或者另一种右移形式的代码都可能会遇到可移植性问题。然而,实际上,几乎所有的编译器 / 机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移。另一方面,对于无符号数,右移必须是逻辑的。

与 C 相比, Java 对于如何进行右移有明确的定义。表达是 x>>k 会将 x 算术右移 k 个位置,而 x>>>k 会对 做逻辑右移。

相关文章

  • C 语言中的移位运算

    C 语言还提供了一组移位运算,向左或者向右移动位模式。对于一个位表示为 []的操作数 x,C 表达式 x<

  • 27、【Swift】高级运算符 - Advanced Opera

    Swift 运算符基本运算符高级运算符(包括 C 或 Objective-C 所有按位和移位运算符。) 与 C 的...

  • 常见位运算及技巧

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

  • C语言:移位运算

    C语言:移位运算 左移 << i << j i中所有的位向左移动j个位置,而右边填入0 所有小于int的类型,移位...

  • C 语言的移位运算

    C 语言的移位运算 参考博客:http://blog.csdn.net/e3399/article/details...

  • Go的移位运算符的优先级比算术运算符大

    1.Go的移位运算符的优先级比算术运算符大,C++反之2.不管什么语言移位运算符前的运算都得加括号3.写go的快排...

  • C语言位运算

    C语言位运算_C语言中文网 C语言位域(位段)_C语言中文网

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

  • python关于&&和||的问题

    &&和||是多数高级语言中通用的逻辑运算符,表示并和或,诸如C语言、C++、JAVA等主流语言但是在python语...

  • 干货丨C语言中的逻辑值

    C语言中的逻辑值 1.C语言中的逻辑值 2.逻辑运算符的运算规律 3.逻辑值的举例说明 一.C语言中的逻辑值 逻辑...

网友评论

      本文标题:C 语言中的移位运算

      本文链接:https://www.haomeiwen.com/subject/tjznwrtx.html