14.8 Shift operators

本文详细介绍了C#中位左移(<<)和位右移(>>)运算符的功能及使用方法。包括如何通过这些运算符进行位级别的操作、运算符重载的规则、以及不同数据类型下的位移行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The << and >> operators are used to perform bit shifting operations.
shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression
For an operation of the form x << count or x >> count, binary operator
overload resolution (?4.2.4) is
applied to select a specific operator implementation. The operands are
converted to the parameter types of
the selected operator, and the type of the result is the return type of the
operator.
Chapter 14 Expressions
163
When declaring an overloaded shift operator, the type of the first operand
must always be the class or struct
containing the operator declaration, and the type of the second operand
must always be int.
The predefined shift operators are listed below.
?Shift left:
int operator <<(int x, int count);
uint operator <<(uint x, int count);
long operator <<(long x, int count);
ulong operator <<(ulong x, int count);
The << operator shifts x left by a number of bits computed as described
below.
The high-order bits outside the range of the result type of x are
discarded, the remaining bits are shifted
left, and the low-order empty bit positions are set to zero.
?Shift right:
int operator >>(int x, int count);
uint operator >>(uint x, int count);
long operator >>(long x, int count);
ulong operator >>(ulong x, int count);
The >> operator shifts x right by a number of bits computed as described
below.
When x is of type int or long, the low-order bits of x are discarded, the
remaining bits are shifted
right, and the high-order empty bit positions are set to zero if x is
non-negative and set to one if x is
negative.
When x is of type uint or ulong, the low-order bits of x are discarded, the
remaining bits are shifted
right, and the high-order empty bit positions are set to zero.
For the predefined operators, the number of bits to shift is computed as
follows:
?When the type of x is int or uint, the shift count is given by the
low-order five bits of count. In other
words, the shift count is computed from count & 0x1F.
?When the type of x is long or ulong, the shift count is given by the
low-order six bits of count. In
other words, the shift count is computed from count & 0x3F.
If the resulting shift count is zero, the shift operators simply return the
value of x.
Shift operations never cause overflows and produce the same results in
checked and unchecked contexts.
When the left operand of the >> operator is of a signed integral type, the
operator performs an arithmetic
shift right wherein the value of the most significant bit (the sign bit) of
the operand is propagated to the
high-order empty bit positions. When the left operand of the >> operator is
of an unsigned integral type, the
operator performs a logical shift right wherein high-order empty bit
positions are always set to zero. To
perform the opposite operation of that inferred from the operand type,
explicit casts can be used. [Example:
For example, if x is a variable of type int, the operation
unchecked((int)((uint)x >> y)) performs a
logical shift right of x. end example]
### 关于 `shift` 关键字的用法 在编程领域,`shift` 并不是一个严格意义上的关键字,而是一种操作符的行为描述。通常情况下,它指的是位移运算符(bitwise shift operators),用于对二进制数据进行左移或右移的操作。以下是关于位移运算符的具体说明: #### 左移运算符 (`<<`) 左移运算符会将指定的数据按位向左移动一定的位置数,右侧补零。每左移一位相当于乘以2。 ```c int result = 4 << 1; // 将整数4 (0b0100) 向左移动1位, 结果为8 (0b1000) ``` 此行为可以被用来高效地实现幂运算或其他基于指数增长的需求[^3]。 #### 右移运算符 (`>>`) 右移运算符则相反,它是将数据按照指定位数向右移动,左侧高位由符号位填充(对于有符号数)或者填零(对于无符号数)。每次右移一位大致等于除以2。 ```c int result = 8 >> 1; // 把数值8(即二进制形式下的0b1000),往右边挪动了一格变成了4(也就是0b0100). ``` 这种技术经常应用于资源受限环境中的性能优化场景下作为替代传统算术运算的方式之一[^4]。 另外,在某些高级脚本语言里比如Python,“逻辑右移”总是通过正数来填补腾出来的空间不管原来那个数字是不是负数;而在C++或者其他低级一点的语言当中,则取决于该变量是否有标记成‘unsigned’未签署状态决定如何处理这些空白区域是塞入新的'0's还是复制现有的最高有效位(MSB)[^5]。 值得注意的是虽然这里讨论主要围绕着C/C++展开论述因为它们最常暴露此类底层细节给开发者但是几乎所有现代程序设计都会支持类似的比特级别操控功能只是表现形式略有差异而已。 ### 示例代码展示 下面给出一段简单的例子演示上述概念的应用: ```cpp #include <iostream> using namespace std; int main() { unsigned char byte_value = 0b00001111; cout << "Original value: "; for(int i=7;i>=0;--i){ cout << ((byte_value&(1<<i))? '1':'0'); } cout<<"\n"; // Shift operations byte_value <<=2;// Left shifting by two positions. // Original binary was 00001111 now becomes 00111100 cout << "After left shift by 2 bits: "; for(int i=7;i>=0;--i){ cout << ((byte_value & (1<<i)) ? '1': '0'); } cout<<"\n"; } ``` 以上片段展示了怎样利用位元转移改变资料内部结构同时保持其外部接口不变从而达到特定目的如压缩储存或是加速计算过程等效果[^6].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值