スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[WP]no.016 ビット制御

別の事をやりたかったんですが手間がかかってしまった…

i ビット目を立てたり立てなかったりするプログラム。
もっと簡単な方法があるともいます。

bit.h

int sgetb(const void*,int);
void ssetb(void*,int,int);


testbit.c

#include <stdio.h>

#include "bit.h"

// 二進数表示
void printb(const void *str,int size){
int i,j,d;
for (i=0;i<size;i++){
d=(int)(((char*)str)[i]);
for (j=0;j<8;j++){
putchar('0'+(d&1));
d=d>>1;
}
putchar(' ');
}
putchar('\n');
}

void main(){
int d;
d=254;
printb(&d,4);
d=257;
printb(&d,4);

ssetb(&d,1,1); // インデックス1(2bit目)に1をセット
printb(&d,4);

ssetb(&d,8,0); // インデックス8(2byte0bit目)に0をセット
printb(&d,4);

printf("%d\n",sgetb(&d,0));
}


実行結果
01111111 00000000 00000000 00000000
10000000 10000000 00000000 00000000
11000000 10000000 00000000 00000000
11000000 00000000 00000000 00000000
1
bit.c

#include <stdio.h>

#include "bit.h"

int sgetb(const void *string,int idx){
int byte=idx/8,bit=idx%8;
return (((int)((char*)string)[byte])>>bit)&1;
}

void ssetb(void *string,int idx,int data){
int byte=idx/8,bit=idx%8;
((char*)string)[byte]=
(((int)(((char*)string)[byte]))&~(1<<bit))|((data&1)<<bit);
}



分かりにくいので動作順
bitの順は実行結果とは逆です(通常のアラビア数字と同じ方向)

sgetb(&data,4)
10100110 元のデータ「((int)((char*)string)[byte])」
00001010 右シフトする「>>bit」
00000000 最下位ビットを取得「&1」

ssetb(&data,4,1)
10100110 元のデータ「((int)((char*)string)[byte])」
00010000 変更したいビットを立てる「(1<<bit)」
11101111 反転「~(1<<bit)」
10100110 論理積により変更したいビットを0にする「(((int)(((char*)string)[byte]))&~(1<<bit))」
00000001 立てたい
00010000 変更したいビットに移動((data&1)<<bit)
10110110 論理和


楽な方法があるはずなんですけどねぇ。無いかなぁ。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
635位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
94位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。