質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

2928閲覧

2の補数表現について

yu__

総合スコア108

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/26 03:03

###2の補数表現について

python

1x = -167 2print(x) 3print(bin(x))
-167 -0b10100111

python

1print(x & 255) 2print(bin(x & 255))
89 0b1011001

のようになります。ここまでは理解できます。

python

1print(x | 255) 2print(bin(x | 255))
-1 -0b1

となる理由が分かりません。
x & 255が89になるのであれば、xは89的なものになるので-1が出力される理由は何故でしょうか?
わかる方がいれば教えて頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

-167を補数表現するためには、8ビットでは足りません。
符号付き8ビット整数の表現範囲は -128~127 になります。
このため-167の補数を表現するためには9ビット以上の範囲が必要となります。
また、pythonのbin()関数は負の整数を-(絶対値)と表現するため、補数処理を観察するのには向いていません。

python

1x = -167 2print(" x :"+format(x)) 3print(" bin(x):"+bin(x)) 4 5 6print(" x & 0xff :"+format(x & 0xff,"016b")) 7print("89 & 0xff :"+format(89 & 0xff,"016b")) 8print(" x & 0xffff :"+format(x & 0xffff,"016b")) 9 10print(" x | 0xffff :"+format((x | 0xffff) ,"016b")) 11print(" x | 0xffff :"+format((x | 0xffff) & 0xffff,"016b")) 12 13print(" ~x :"+format( ~x)) 14print(" bin(~x):"+bin(~x)) 15print("~x & 0xffff :"+format(~x & 0xffff,"016b")) 16print(" x & 0xffff :"+format(x & 0xffff,"016b")) 17 18#出力# 19# x :-167 # 20# bin(x):-0b10100111 # 21# x & 0xff :0000000001011001 # 0xff=255=0b11111111との& 22#89 & 0xff :0000000001011001 # 89と一致 23# x & 0xffff :1111111101011001 # 実際は上位ビットに1が詰められている 24# x | 0xffff :-000000000000001 # "|"した場合 1|0は1のため、上位ビットに1が詰められている=マイナスになる 25# x | 0xffff :1111111111111111 # 下位16ビットを切り出した場合 26# ~x :166 # ビット反転"~"を使った場合。2の補数となる。 27# bin(~x):0b10100110 # bin(x)と比べてもよくわからない 28#~x & 0xffff :0000000010100110 # 下位16ビットを表示して比較すると反転しているのがわかる。 29# x & 0xffff :1111111101011001 # 30

投稿2020/07/26 04:56

Kaleidoscope

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

https://docs.python.org/ja/3/library/stdtypes.html#bitwise-operations-on-integer-types

ビット単位演算の結果は、あたかも両方の値の先頭を無限個の符号ビットで埋めたものに対して計算したかのような値になります。

投稿2020/07/26 04:22

編集2020/07/26 04:23
quickquip

総合スコア11063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

print(bin(x))-0b10100111となっていますが、Python3ではメモリのある限り大きな整数を入れられるためにこのような表記となっていて、実際のビットパターンは...101011001のようなものです。

ここに2550b11111111)を|すれば、...11111111と全部が1になって、これはマイナス1です。

投稿2020/07/26 03:49

編集2020/07/26 03:53
maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/26 03:51

「xは89的なものになる」というのが単なる思い込みです。ビットの立っているものをOR演算すれば、元のビットによらず1となりますので、「違いを消す」方向に動きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問