0% found this document useful (0 votes)
26 views14 pages

Bit Op Stanford PDF

The document discusses bit shift operators in C. It explains that the left shift operator (<<) shifts a bit pattern to the left by a specified number of bits, filling in new lower order bits with zeros. The right shift operator (>>) shifts a bit pattern to the right, with the difference being that for signed integers, new higher order bits are filled with the sign bit to preserve the number's sign, while for unsigned integers and logical right shifts, new bits are filled with zeros. The document cautions that shift operations can have unintended behavior if operator precedence or default integer types are not considered carefully.

Uploaded by

natitsionmam
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
26 views14 pages

Bit Op Stanford PDF

The document discusses bit shift operators in C. It explains that the left shift operator (<<) shifts a bit pattern to the left by a specified number of bits, filling in new lower order bits with zeros. The right shift operator (>>) shifts a bit pattern to the right, with the difference being that for signed integers, new higher order bits are filled with the sign bit to preserve the number's sign, while for unsigned integers and logical right shifts, new bits are filled with zeros. The document cautions that shift operations can have unintended behavior if operator precedence or default integer types are not considered carefully.

Uploaded by

natitsionmam
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

Demo: Powers of 2

70
Plan For Today
• Recap: Integer Representations
• Truncating and Expanding
• Bitwise Boolean Operators and Masks
• Demo 1: Courses
• Break: Announcements
• Demo 2: Powers of 2
• Bit Shift Operators

71
Left Shift (<<)
The LEFT SHIFT operator shifts a bit pattern a certain number of positions to the
left. New lower order bits are filled in with 0s, and bits shifted off of the end are
lost.

x << k; // shifts x to the left by k bits

8-bit examples:
00110111 << 2 results in 11011100
01100011 << 4 results in 00110000
10010101 << 4 results in 01010000

72
Right Shift (>>)
The RIGHT SHIFT operator shifts a bit pattern a certain number of positions to
the right. Bits shifted off of the end are lost.

x >> k; // shifts x to the right by k bits

Question: how should we fill in new higher-order bits?


Idea: let’s follow left-shift and fill with 0s.

short x = 2; // 0000 0000 0000 0010


x >> 1; // 0000 0000 0000 0001
printf("%d\n", x); // 1
73
Right Shift (>>)
The RIGHT SHIFT operator shifts a bit pattern a certain number of positions to
the right. Bits shifted off of the end are lost.

x >> k; // shifts x to the right by k bits

Question: how should we fill in new higher-order bits?


Idea: let’s follow left-shift and fill with 0s.

short x = -2; // 1111 1111 1111 1110


x >> 1; // 0111 1111 1111 1111
printf("%d\n", x); // 32767!
74
Right Shift (>>)
The RIGHT SHIFT operator shifts a bit pattern a certain number of positions to
the right. Bits shifted off of the end are lost.

x >> k; // shifts x to the right by k bits

Question: how should we fill in new higher-order bits?


Problem: always filling with zeros means we may change the sign bit.
Solution: let’s fill with the sign bit!

75
Right Shift (>>)
The RIGHT SHIFT operator shifts a bit pattern a certain number of positions to
the right. Bits shifted off of the end are lost.

x >> k; // shifts x to the right by k bits

Question: how should we fill in new higher-order bits?


Solution: let’s fill with the sign bit!

short x = 2; // 0000 0000 0000 0010


x >> 1; // 0000 0000 0000 0001
printf("%d\n", x); // 1
76
Right Shift (>>)
The RIGHT SHIFT operator shifts a bit pattern a certain number of positions to
the right. Bits shifted off of the end are lost.

x >> k; // shifts x to the right by k bits

Question: how should we fill in new higher-order bits?


Solution: let’s fill with the sign bit!

short x = -2; // 1111 1111 1111 1110


x >> 1; // 1111 1111 1111 1111
printf("%d\n", x); // -1!
77
Right Shift (>>)
There are two kinds of right shifts, depending on the value and type you are
shifting:
• Logical Right Shift: fill new high-order bits with 0s.
• Arithmetic Right Shift: fill new high-order bits with the most-significant bit.

Unsigned numbers are right-shifted using Logical Right Shift.


Signed numbers are right-shifted using Arithmetic Right Shift.

This way, the sign of the number (if applicable) is preserved!

78
Shift Operation Pitfalls
1. Technically, the C standard does not precisely define whether a right shift for
signed integers is logical or arithmetic. However, almost all
compilers/machines use arithmetic, and you can most likely assume this.
2. Operator precedence can be tricky! For example:

1<<2 + 3<<4 means 1 << (2+3) << 4 because addition and


subtraction have higher precedence than shifts! Always use parentheses
to be sure:

(1<<2) + (3<<4)

79
Bit Operator Pitfalls
• The default type of a number literal in your code is an int.
• Let’s say you want a long with the index-32 bit as 1:

long num = 1 << 32;

• This doesn’t work! 1 is by default an int, and you can’t shift an int by 32
because it only has 32 bits. You must specify that you want 1 to be a long.

long num = 1L << 32;

80
Recap
• Recap: Integer Representations
• Truncating and Expanding
• Bitwise Boolean Operators and Masks
• Demo 1: Courses
• Break: Announcements
• Demo 2: Powers of 2
• Bit Shift Operators

Next time: How can a computer represent and manipulate more complex data
like text?
81
Extra Slides

82
Demo: Absolute Value

83

You might also like