简体   繁体   中英

What does the operator “<<” mean in C#?

I was doing some basic audio programming in C# using the NAudio package and I came across the following expression and I have no idea what it means, as i've never seen the << operator being used before. So what does << mean?

Please give a quick explaination of this expression.

short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);

Definition

The left-shift operator (<<) shifts its first operand left by the number of bits specified by its second operand. The type of the second operand must be an int. << Operator (MSDN C# Reference) 替代文字

For binary numbers it is a bitwise operation that shifts all of the bits of its operand; every bit in the operand is simply moved a given number of bit positions, and the vacant bit-positions are filled in.

Usage

Arithmetic shifts can be useful as efficient ways of performing multiplication or division of signed integers by powers of two. Shifting left by n bits on a signed or unsigned binary number has the effect of multiplying it by 2 n . Shifting right by n bits on a two's complement signed binary number has the effect of dividing it by 2 n , but it always rounds down (towards negative infinity). This is different from the way rounding is usually done in signed integer division (which rounds towards 0). This discrepancy has led to bugs in more than one compiler.

An other usage is work with color bits . Charles Petzold Foundations article "Bitmaps And Pixel Bits" shows an example of << when working with colors:

ushort pixel = (ushort)(green << 5 | blue);

Shift left (and the counterpart, Shift right) moves the bits in the given direction.

Shift left is more or less times 2, but faster

Shift right is more or less divided by 2, but faster

这是一个左移位操作,非常常见的编程习惯: http//en.wikipedia.org/wiki/Arithmetic_shift

It's called left-shift operator.

Follow this link for more detailed information.

The bitwise operator has already been explained quite a few times already. Let's say that buffer[0] contains 1 , buffer[1] contains 2 and index is 0 and replace these values:

short sample = (short)((buffer[1] << 8) | buffer[0]);
short sample = (short)((1 << 8) | 2);

Now, a semi-graphical representation. This is the numeral 1 in a binary representation:

0000 0001

Shifting eight positions to the left would make this number to "overflow" from a single byte. However, the compiler is smart enough to give us more room.

0000 0001 0000 0000

Now, the right part: the number 2 looks like this in binary:

0000 0010

And the "|" operator (bitwise OR) makes just put the two values together and comparing bit per bit.

  0000 0001 0000 0000
| 0000 0000 0000 0010
= 0000 0001 0000 0010

And the final value is stored in your "sample" variable (in this case, 258.) The reverse operation is similar:

buffer[0] = sample & 255;
buffer[1] = (sample & (255 << 8)) >> 8;

左移这里有一些msdn来帮助你: http//msdn.microsoft.com/en-us/library/ayt2kcfb( VS.80) .aspx

As a few people have pointed out already it is a shift operation.

However It is worth noting that depending on whether the operand is a signed integral type or a unsigned integral type it will apply either an arithmetic or logical shift.

See the bottom of this page on msdn.

The "<<" is a shift left operator. x << y shifts bit pattern x y position left.

For example, if x was 0001 0101 and y was 1 then the result would be 0010 1010 . It's like someone's pushed each bit left one.

As others have said the << operator moves the bits of a number left. The normal reason why someone would do this in an Audio application is to combine two 8bit mono-samples (one for left and right) into a 16 bit sterio sample.

So in the sample code it looks like Buffer contains sterio encoded with left and right in alternate samples. By shifting the first left 8 and oring the second the author is combining them to form a 16bit sterio sample with the High 8bits being one channel and the low 8bits being the other.

If in your example the buffer contained:

1001 0100 (Right)
1001 0011 (Left)

The result you would get in sample is:

(Left)    (Right)
1001 0011 1001 0100

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM