3.1 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 & b
-
10000000 a & (b ^ b)
-
01010000 a & ~b
-
00001010 ~a & b
-
01010000 a & ~b
-
10101011
b | (~a & ~b)
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.
Every bit position represents a power of 2. Shifting all bits one place to the left multiplies every bit's value by 2.
- 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?
100 + 100 = 200 in bit it is 11001000. Because the first is 1 the bit represents a negative number -56.
- What is the bit representation of negative zero? Explain your answer.
There is no negative zero zero is only represented by 00000000.
- What's the largest integer that can be represented in a single byte? Explain your reasoning.
127 is the largest because the first 1 represents a negative hence 01111111 = 127
- What's the smallest integer that can be represented in a single byte? Explain your reasoning.
-128 is the smallest where the smallest is 10000000.
- What's the largest integer that can be represented in
nbits? Explain your reasoning. 2^(n-1) -1 : one bit is used for the sign example if n = 3 bits then it would be 2^2 - 1 = 3 leading to 011.
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.
Use the leading bits of the first byte to indicate the total length of the characters where 0--------- = 1 byte "a" then 110------- = 2 byte "n" characters, 1110------ = 3 byte, shade characters then each byte has specific meaning as used above.