読者です 読者をやめる 読者になる 読者になる

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'