2進数の話
読んだ内容を確かめるときによくIPythonを使うんですが…
:::python
In [18]: format(-10, '08b')
Out[18]: '-0001010'
違うんだ.期待した答えはそうじゃないんだ……
:::python
In [19]: format(0x100 - 10, '08b')
Out[19]: '11110110'
ビット操作のアルゴリズム
読んでた本に載ってて面白いと思ったのでメモ.
:::python
In [1]: def bin2cmp(x):
...: if x >= 0:
...: return format(x, '08b')
...: else:
...: return format(0x100 + x, '08b')
...:
In [2]: x = 100
In [3]: bin2cmp(x)
Out[3]: '01100100'
In [4]: bin2cmp(~x)
Out[4]: '10011011'
In [5]: bin2cmp(x - 1)
Out[5]: '01100011'
In [6]: bin2cmp(-x)
Out[6]: '10011100'
In [7]: bin2cmp(x & (x - 1)) # 最も右の1を削除したビット
Out[7]: '01100000'
In [8]: bin2cmp(x & -x) # 最も右の1を抽出したビット
Out[8]: '00000100'
In [9]: bin2cmp(x | -x) # 最も右の1から左を1にしたビット
Out[9]: '11111100'
In [10]: bin2cmp(x ^ -x) # 最も右の1を0にし,そこから左を1にしたビット
Out[10]: '11111000'
In [11]: bin2cmp(x | (x - 1)) # 最も右の1から右を1にしたビット
Out[11]: '01100111'
In [12]: bin2cmp(x ^ (x - 1)) # 最も右の1を取り出し,そこから右を1にしたビット
Out[12]: '00000111'
In [13]: bin2cmp(~x & (x - 1)) # 最も右の1から右を1にしたビット
Out[13]: '00000011'