3.5 KiB
Boolean questions
Create the following variables.
a = Bits("11110000")
b = Bits("10101010")
For each of the following bytes, give an equivalent
expression which uses only a, b, and bit operators.
The answers to the first two questions are given.
-
01010101 ~b
-
00000101 ~a & ~b
-
00000001 a >> 7
-
10000000 a << 3
-
01010000 a & ~b
-
00001010 ~a & b
-
01010000 a & ~b
-
10101011 b | (a >> 7)
Integer questions
These questions are difficult! Try exploring ideas with Bits
in Terminal, a paper and pencil, and a whiteboard. And definitely
talk with others.
- If
arepresents a positive integer, andone = Bits(1, length=len(a)), give an expression equivalent to-a, but which does not use negation.
~a + one
-
It is extremely easy to double a binary number: just shift all the bits to the left. (
a << 1is twicea.) Explain why this trick works. This trick works because every spot to the left is double of the right so moving everything will double the entire number -
Consider the following:
>>> hundred = Bits(100, 8)
>>> hundred
01100100
>>> (hundred + hundred)
11001000
>>> (hundred + hundred).int
-56
Apparently 100 + 100 = -56. What's going on here?
the full 8-bit is equal to 256 so 200 mod 256 is the same as -56 mod 256
-
What is the bit representation of negative zero? Explain your answer. zero is neither negative or positive, it is just the absence of a value so it would just be 00000000
-
What's the largest integer that can be represented in a single byte? Explain your reasoning. the largest integer that can be represented by a single byte is 127. A byte is 8 bits, since the very left bit is positive with a 0, the highest representation would be 01111111 which is equal to 127
-
What's the smallest integer that can be represented in a single byte? Explain your reasoning. The smallest integer that can be represented by a single byte is -128. Similar to problem 13, to have the smallest integer we need the largest negative number which is only represented by the very left number. Therefore it would be 10000000 because we are not adding any positives to it.
-
What's the largest integer that can be represented in
nbits? Explain your reasoning. The largest integer that can be represented in n bits is 2^(n-1) -1. Based on the example in 13 this pattern makes sense, we have to do n-1 because the first number is negative and can not represent a positive integer. We also have to subtract 1 because it is one less.
Text questions
-
Look at the bits for a few different characters using the
utf8encoding. You will notice they have different bit lengths:>>> Bits('a', encoding='utf8') 01100001 >>> Bits('ñ', encoding='utf8') 1100001110110001 >>> Bits('♣', encoding='utf8') 111000101001100110100011 >>> Bits('😍', encoding='utf8') 11110000100111111001100010001101When it's time to decode a sequence of utf8-encoded bits, the decoder somehow needs to decide when it has read enough bits to decode a character, and when it needs to keep reading. For example, the decoder will produce 'a' after reading 8 bits but after reading the first 8 bits of 'ñ', the decoder realizes it needs to read 8 more bits.
Make a hypothesis about how this could work.
I noticed that the bits for ñ start with two 1's which could indicate that it needs to read 2 bytes, the same is true for the next 2 sets of bits