こんにちは。
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マイコンのレジスタ操作に使おうかなと思っているからです。これが使えれば、そこそこ見やすくなるかな?と思っていますが、どうなんでしょうか。まあ分かりませんが、とりあえずやってみようと思います。
- 白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81Amazon(アマゾン)高いだけあって、よく吸えます。スルーホール基板の吸い取りには必須レベルで使えます。
- 太洋電機産業(goot) 温調はんだこて PX-201 70Wハイパワー 鉛フリーはんだ対応 日本製Amazon(アマゾン)温度調整出来るタイプのハンダこてです。これさえあれば、チップ部品でもリード部品でもOK。使いやすいです。
- ENGINEER エンジニア ハンダ吸取器 SS-02Amazon(アマゾン)先端にシリコンチューブが付いており、スルーホールもめちゃ吸えます。電動吸い取り機よりも値段が安価なので是非!
- アネックス(ANEX) ピンセット ステンレス製 AAタイプ 125mm 2本組(直/先曲) ATW-S3Amazon(アマゾン)安いのに、先端の精度がそこそこ良いので、使いやすいです。チップ部品のはんだ付けなどにどうぞ。