こんにちは。

Yukiです。今回は、特定のビットを置き換える方法について、考えようと思います。

 

 

 

  やりたいこと

 

特定のビットだけ変更したいのです。

 

下の図だと、0b 1010 1010 から、上位4ビットのみを0b1100で置換したいというイメージです。

0から1にするときは、ORして、1から0にするときはANDすれば実現できます。ただし、複数のビットを変更しようとすると、難しいんですよね。

 

 

 

  実現する方法

 

まず変更するビットをすべて0にします。

これは、マスクを作ってあげて、ANDすれば実現できます。

 

変更する場所が0であるならば、ORしてあげれば実現できるはずです。

 

下のような図の感じですね。

 

ということで、早速C言語で書いてみました。

 

 

#include <stdio.h>

#include <stdint.h>

 

//  ビット置き換え関数

//  引数 data:置き換え前のビット列 | byte:置き換えるビット | len:置き換えるビットの長さ | shift:シフト数

//  

uint32_t bit_replace(uint32_t data , uint32_t byte , uint8_t len , uint8_t shift){  

    uint32_t mask = ~(((1 << len) - 1) << shift);

    data &= mask;

    data |= byte << shift;

    return data;

}

 

 

Uint32_tを使用しているので、stdint.hが必要です。

 

 

 

  動作

 

ちょっと見えにくいですが、0x55の7bit目~3bit目を0b1001に変換します。

つまり 0b0101 0101 から 0b1001 0101 にするということですね。

0b1001 0101 は 0x95になるということですね。

 

 

正常に動作しているっぽいですね。

 

 

 

  余談

 

なぜuint32_tを使っているのかというと、32bitマイコンのレジスタ操作に使おうかなと思っているからです。これが使えれば、そこそこ見やすくなるかな?と思っていますが、どうなんでしょうか。まあ分かりませんが、とりあえずやってみようと思います。

Yukiのプロフィール
使いやすかったもの
Yuki