• ベストアンサー

ビット演算のやり方

a=10101,b=11011,c=10001という文字があり まずこのa,b,cを一列に並べ d=101011101110001という文字列にした後に、これを5bit単位にわけ その中の下位4bitを使い並べるとした時どうしたらいいでしょうか? 5bit単位とは次のように分けます d=10101 11011 10001 それで分けた5bitごとに下位4bitを適用するとして、 dは0101  1011  0001となり 結果をe=010110110001とするにはどうしたらいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.6

>任意の桁数で区切る事と、 strncpy()を使ってください。n文字ずつで切り出すなら、  char buf1[n+1];  strncpy(buf1, str+i*n, n);  buf1[n]='\0'; >その下○桁を残す方法が分かりません。 右からm桁残すならstrcpy()で  char buf2[m+1];  strcpy(buf2, buf1+strlen(buf1)-m); こんな感じでいかがでしょうか。  

1-step
質問者

お礼

回答ありがとうございました。 返事が遅くなってしまい申し訳ありません。 区切り方と残し方の二つの方法よくわかりました。 ありがとうございます^^

その他の回答 (5)

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.5

何をやりたいのかわかりにくいですね。もう少し整理してください。 ・はじめの条件は何ですか?  「a[]="10101",b[]="11011",c[]="10001"という文字があり」 ですか  「長い文字"101000111000110101100110011001100"があったときに」ですか?  桁数に制限はないのですか? ・「ある長さで区切り」というのは  どんな長さでも対応できるようにということですか?  それは、左右どちらから区切りますか? ・「下4桁を残し」は固定でしいのですか? ・「最後はこれを3D66といった16進表示にする」ということは  整数型の数値は必要ではなく、16進形式の文字に変換すればいいのですか? で、結局どこがわからないのですか? ・任意の桁数に区切る方法? ・文字を連結する方法? ・0,1の文字列を16進の文字列に変換する方法?

1-step
質問者

お礼

回答ありがとうございます。すいません説明不足です。 自分が今やっていることは、シュミレーション結果を16進の文字で表示させようとしています。 シュミレーションでの結果は8個出てきます。その8個の結果を一列にして一つの物とみなします。 シュミレーション結果の雑音と思われる部分を取り除き残りを繋げて、一つの結果を出そうとしています。 1.はじめの条件は8個です。 シュミレーション結果は時間単位で区切るので、桁数に制限はありません。 2.桁数を区切るのには、どんな長さにも対応できる物を作りたいです。左から区切ろうと思います。 3.残すものは固定です。8桁で区切った時の下4桁は固定です。 4.数値は16進形式の文字だけでかまいません。 今分からない事は 任意の桁数で区切る事と、その下○桁を残す方法が分かりません。 色々なパターンで実験したいと思っています。 8bitずつに区切った時は4bit残す、2bitにした時は1bit残すって感じに色々なパターンを試したいと考えています、どの長さにも対応できるものにしたいです。

noname#5537
noname#5537
回答No.4

#1 は C で書きました。 > char buf[256]でa,b,cを並べた状態を作ったって事でしょうか?  > この時の[256]は256文字まで取り込めるということですよね? そうです。終端文字も含めて256文字です。 > a+1はどういう意味なのでしょうか? a はポインタで,"10101" の先頭を指しています。 a + 1 とすると,ポインタが1文字分進んで,"0101" の先頭を指すことになります。 > やりたい事は長い文字列があった時に > 101000111000110101100110011001100 ここでいう,1 とか 0 というのが 1 文字を表していると考えてよいのでしょうか? つまり,  char s[] = "101000111000110101100110011001100"; ということですか?

1-step
質問者

お礼

回答ありがとうございます。説明不足すいませんm(__)m >ここでいう,1とか0というのが1文字を表していると考えてよいのでしょうか? はいそうです、1や0は1文字を表しています。

  • fluffy
  • ベストアンサー率29% (87/293)
回答No.3

なぜ素直に8bitでやらないのでしょうか?これがどうしてビット演算なのかよく分かりません。 char に入れて上位4bitを0x0fでマスクすれば1ニブル分だけ になるので2個のcharデータを持ってきて char A,B(なにかいれておく) char C=(A&0x0f<<4)|B;とかするのはだめですか? こういうことがしたいのではない? 文字がたくさんあってやり方が分からないのであれば 一文字ずつまずは読んできてやればいいと思います。順番に進んでいく方がいいと思います。具体的にやりたいことを書いてあれば別の事もかんがえられますけど。

1-step
質問者

お礼

回答ありがとうございます。 もしかしてビット演算じゃないかもしれません^^; 一文字ずつ読んで次々に繋いでいくのはいいかもしれませんね。 やりたい事は長い文字列があった時に 101000111000110101100110011001100 ある長さで区切り(ここは何バイトでもかまいません) 10100011 10001101 01100110 01100110 0 下4桁を残し 0011 1101 0110 0110 残った数字をつなげてひとつの文字列にしたいです。 0011 ← 1101 ← 0110 ← 0110 つなげた結果 0011110101100110 下4桁を残したいのは、データを16進数で扱いたいから4桁残したいと思いました。 0011110101100110 最後はこれを 3D66といった16進表示にするって物を作りたいです。

noname#5537
noname#5537
回答No.2

あ, char a = 0x15; char b = 0x1b; char c = 0x11; ということでしょうか? これなら確かにビット演算ですね。

noname#5537
noname#5537
回答No.1

ビット演算というより文字列処理の話でしょうか? a, b, c はもともと5桁ごとになっているようですが,わざわざくっつけてから,再び5桁ごとに分ける必要があるのでしょうか? #include <stdio.h> int main(int argc, char* argv[]) {  const char *a = "10101";  const char *b = "11011";  const char *c = "10001";  char buf[256];  sprintf(buf, "%s%s%s", a+1, b+1, c+1);  puts(buf);  return 0; } こんなのじゃだめでしょうか?

1-step
質問者

お礼

回答ありがとうございます。これはC++ですよね? 今自分が作っているのはCの方だったんですよ^^; すいません、説明不足でした。 自分が作ろうとしていたのは1と0の長い文字列をある間隔ごとに区切って、その下4桁を取り出せるプログラムを作ろうと思い今回のような質問をさせていただきました。 そこでa,b,cの数字はもっと大きな数字を使用しようと思うのですが何桁になるか、わからなっかったので、まずは簡単な物を作ってから色々試していこうと思いました。 char buf[256]でa,b,cを並べた状態を作ったって事でしょうか? この時の[256]は256文字まで取り込めるということですよね? 実際の数字は数千桁にしたいのですがchar buf[4000]としたら4000桁まで取り込めるということなのでしょうか? 5bit単位に区切って下4桁を取り出した部分っていうのはここの部分になるのでしょうか? >sprintf(buf, "%s%s%s", a+1, b+1, c+1); a+1はどういう意味なのでしょうか?5bit取り出して1を足したので全部が一桁繰り上がり1bit分シフトさせたという事ですか?

関連するQ&A