LoginSignup
4
0

たまたま賃貸物件情報サイト Apartment Finder を見ていたらクエリ文字列が面白かったのでメモします。

Apartment Finder

Apartment Finder の検索フィルタ

チェックボックスでフィルタをかけることができるようになっています。例えば、アメニティ(快適性、居住性)のフィルタはこんな感じです。

CleanShot_2023-06-18_at_12.28.252x.png

適用されているフィルタはクエリ文字列で保持されているようです。

https://www.apartmentfinder.com/District-Of-Columbia/q/?am=18874644

アメニティのキーは am ですので、英語の amenity に最初のふたもじを取ったと思われます。値は 18874644 。この値はどうのようにして決定されているのか気になります。気になりませんか?

多分ビットフィールドじゃないかなと思い、解読してみることにしました。

ビットフィールド

ビットフィールド (英: bit field) は、プログラミングにおいてブーリアン型フラグをコンパクトなビットの並びとして格納する手法である。ビットフィールドの格納には、整数型を使用する。個々のフラグは、ビット単位で格納される。個々のフラグは、ビット単位で格納される。通常は、ソースコードで、個別のビットがフラグに対応する意味を付けられた、2の冪乗定数が定義される。ビット演算論理積論理和否定の組み合わせが、フラグのセット・リセットとテストを行うために使われる。

Elixir 言語で 2 の冪乗を列挙してみます。

iex> for n <- 1..25, do: 2 ** n
[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768,
 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216,
 33554432]

これらの値が定数となります。各値に何らかの意味を割り当てます。例えば、2を「牛丼」、4を「味噌汁」、8を「お新香」と割り当てた場合、それらのすべての組み合わせをひとつの整数で表現できます。

# 定数
gyudon    = 2 # 二進数: 0b0010
misoshiru = 4 # 二進数: 0b0100
oshinko   = 8 # 二進数: 0b1000

# 組み合わせ
gyudon + misoshiru + oshinko == 0b1110
gyudon + misoshiru           == 0b0110
gyudon + oshinko             == 0b1010

さらに、Elixir 言語inspect/2 関数を用いて先ほどのアメニティフィルタの値 18874644 を二進数に変換してみます。

iex> 18874644 |> inspect(base: :binary)
"0b1001000000000000100010100"

五つのフラッグが立っていますので、五つチェックされていたフィルタと辻褄があります。

各ビットが何をいみするのか

これは、各フィルタのチェックを一つだけつけて値を確認し、フィルタ名に紐づけていくしかないと思います。

できました。

意味
2 laundry_in_unit
4 dishwasher
16 ac
32 balcony
64 fireplace
128 furnished
256 fitness_center
512 swimming_pool
65536 parking_available
131072 wheelchair_accessible
524288 elevator
1048576 laundry_hookups
2097152 laundry_on_site
4194304 gate
8388608 garage
16777216 utilities_included
33554432 loft

先ほどのアメニティフィルタの値 18874644 で検証してみます。

laundry_on_site    = 2097152
ac                 = 16
dishwasher         = 4
fitness_center     = 256
utilities_included = 16777216

laundry_on_site + ac + dishwasher + fitness_center + utilities_included

答えは 18874644 となるはずです。

:tada:

ビットフィールドの値の足し算、引き算は簡単にできます。

逆に合成された値をプログラミングで解読するには工夫が必要です。

ビットマスク

  • ビット演算と呼ぶビット単位の操作を行う処理である
  • ビットマスクをつかってできること
    • 特定のビットをオン(1)やオフ(0)にする
    • 特定のビットの状態(01)を知る

コミュニティ

いろんなコミュニティから刺激と元氣をいただいています。ありがとうございます。

闘魂コミュニティ

みんなでわいわい楽しく自由に闘魂プログラミングをしています。

ぜひお気軽にお立ち寄りください。

Nervesで組み込み開発するコミュニティ

「Elixir で IoT!?ナウでヤングで cool な Nerves フレームワーク」です。

Elixir 言語でワクワクするコミュニティ

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0