4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ひとりNEONAdvent Calendar 2020

Day 14

bit wise命令

Last updated at Posted at 2020-12-13

はじめに

bitwise.png

  • 基本的には整数型のみ
    • bslには浮動小数点数型を、tst命令には多項式型を引数に取るタイプの命令が存在する
  • bitwise AND、bitwise OR、bitwise XOR、bitwise NOT、bitwise NOR、bitwise NANDがある。
    • あとtst命令とbsl命令も紹介する

OpenCVでの実装の参考

.cpp
        for (; j < roiw8; j += 8)
        {
            uint8x8_t v0  = vld1_u8(src + j);
            uint8x8_t r0 = vcgt_u8(v0, vthreshold8);
            uint8x8_t r0a = vbic_u8(v0, r0);
            vst1_u8(dst + j, r0a);
        }
        for (; j < size.width; j++)
        {
            *(dst + j) = *(src + j) > threshold ? 0 : *(src + j);
        }
  • bic命令を使っているが、引数のr00xff0のどちらかの値を持つ

    • cgt命令は比較命令で、各ベクトルの対応する要素同士でv0 < vthresholdを評価する
    • つまり、v0がしきい値未満だと、0xffが入り、それ以外だと0が入る
    • bic命令は、a AND NOT bなので、結果、しきい値未満の画素は0になる
  • もう1件、and命令の確認

.cpp
            for (; j < roiw8; j += 8)
            {
                uint8x8_t v_src = vld1_u8(src + j);
                uint8x8_t v_dst = vand_u8(vcge_u8(v_src, v_lower8), vcle_u8(v_src, v_upper8));
                vst1_u8(dst + j, v_dst);
            }

            for (; j < size.width; j++)
            {
                u8 srcVal = src[j];
                dst[j] = lowerThreshold <= srcVal && srcVal <= upperThreshold ? 255 : 0;
            }
  • vand命令の入力2つはやはり0xff0のどちらか。
  • それのandを取ることで、所定の条件のときだけ255が書き込まれる
  • 最後の一文はベクトルで余った端っこの処理なので、ベクトル処理でなく通常のコード処理である
  • ベクトル命令と見比べてみると各命令の中身がわかる

早見表

命令 引数 処理内容
and a,b a AND b
orr a,b a OR b
eor a,b a XOR b
bic a,b a AND NOT b
orn a,b a OR NOT b
mvn a NOT a
tst a,b (a AND b) == 0
bsl a,b,c c XOR ((c XOR b) AND a)

tst

  • a AND bが0になるかどうか。
    • 0になれば結果は0xffのように、各要素の全ビットが立つ
    • それ以外の場合は、0になる
    • bitwise命令というより、比較命令に近いような?そっちに入れておけばよかったかも?

bsl

  • bitセレクトという変わった命令
  • 引数を3つ取るが、
    • 第1引数(a)のbitが1ならば第2引数(b)からデータを持ってくる
    • 第1引数(a)のbitが0ならば第3引数(c)からデータを持ってくる
    • bit単位でbcの結果をbit単位で組み合わせる命令で、どちらを持ってくるかはaの内容次第

おわりに

  • bitwise命令を紹介した。
  • bit演算子で結構面白い演算もできるので、この演算の組み合わせで色々やってほしい
  • 明日も手島の執筆の予定で、dup命令を紹介する。
4
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?