| この記事の要点 |
|
一覧
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
& | AND(両方 1 なら 1) | 0b1100 & 0b1010 | 0b1000 = 8 |
| | OR(どちらか 1 なら 1) | 0b1100 | 0b1010 | 0b1110 = 14 |
^ | XOR(異なれば 1) | 0b1100 ^ 0b1010 | 0b0110 = 6 |
~ | NOT(ビット反転) | ~12 | -13 |
<< | 左シフト(2 倍) | 3 << 2 | 12 |
>> | 右シフト(1/2 倍) | 12 >> 2 | 3 |
^ はべき乗ではありません。べき乗は ** です。
a, b = 0b1100, 0b1010 # 12, 10
print(bin(a & b)) # 0b1000
print(bin(a | b)) # 0b1110
print(bin(a ^ b)) # 0b110
print(bin(a << 2)) # 0b110000
print(bin(a >> 2)) # 0b11
print(f"{a:08b}") # 00001100 桁を揃えて表示
print(int("1100", 2)) # 12 2 進文字列から int
~ と負数の考え方
Python の int には桁数の上限が無いため、負数は「上位に符号ビットが無限に続く 2 の補数」として扱われます。
print(~12) # -13 ~x == -x - 1
print(~0) # -1
print(~-1) # 0
# 32bit の値として見たいときはマスクする
x = -13
print(x & 0xFFFFFFFF) # 4294967283
print(f"{x & 0xFFFFFFFF:032b}") # 11111111111111111111111111110011
シフトの挙動
print(1 << 100) # 1267650600228229401496703205376 桁あふれしない
print(-8 >> 1) # -4 符号を保つ(算術シフト)
print(-1 >> 10) # -1 何回シフトしても -1 のまま
# 負のシフト量は例外
# print(1 << -1)
# ValueError: negative shift count
Java の >>>(符号なし右シフト)に相当する演算子はありません。必要ならマスクしてから右シフトします。
フラグ管理
READ, WRITE, EXEC = 1, 2, 4 # 0b001, 0b010, 0b100
perm = READ | WRITE # 立てる
print(perm) # 3
print(bool(perm & WRITE)) # True 立っているか
perm &= ~WRITE # 下ろす
print(bool(perm & WRITE)) # False
perm ^= READ # 反転
print(perm) # 0
実務では enum.Flag を使うほうが安全で読みやすくなります。
from enum import Flag, auto
class Perm(Flag):
READ = auto()
WRITE = auto()
EXEC = auto()
p = Perm.READ | Perm.WRITE
print(p) # Perm.READ|WRITE
print(Perm.WRITE in p) # True
print(p & Perm.EXEC) # Perm.0 (空)
集合演算にも同じ記号を使う
a, b = {1, 2, 3}, {2, 3, 4}
print(a & b) # {2, 3} 積集合
print(a | b) # {1, 2, 3, 4} 和集合
print(a ^ b) # {1, 4} 対称差
print(a - b) # {1} 差集合
# 辞書のマージは | (Python 3.9 以降)
print({"a": 1} | {"b": 2}) # {'a': 1, 'b': 2}
よく使うイディオム
n = 12
print(n & 1 == 0) # True 偶数判定(n % 2 == 0 でも可)
print(n & (n - 1) == 0) # False 2 のべき乗か(8 なら True)
print(bin(n).count("1")) # 2 立っているビット数
print(n.bit_count()) # 2 Python 3.10 以降はこちら
print(n.bit_length()) # 4 表現に必要なビット数
x, y = 3, 5
x, y = y, x # 交換は XOR ではなくアンパックで書く
関連
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38