掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29814

ビットの回転
投稿者---初級階段(2007/02/22 15:08:06)


ビットを回転したいですが...
例え:1010 0000 ->0000 0101のように出力したいんですが、どうすればいいですか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ビットの回転 29815 jazz 2007/02/22 15:16:59
<子記事> Re:ビットの回転 29825 ルナレルナ 2007/02/23 13:07:25
<子記事> Re:ビットの回転 29836 ルナレルナ 2007/02/23 17:00:35


No.29815

Re:ビットの回転
投稿者---jazz(2007/02/22 15:16:59)


n7 n6 n5 n4 n3 n2 n1 n0
           ↓ 処理後
n0 n1 n2 n3 n4 n5 n6 n7

のようにしたい、という仕様ですか?





この投稿にコメントする

削除パスワード

No.29816

Re:ビットの回転
投稿者---jazz(2007/02/22 16:07:57)


入力データは、どのような形式で与えますか?
例えば、先の例では、ビット列10100000を十進数で表わした160を
入力データとして与えますか?
あるいは、別の方法で与えますか?


この投稿にコメントする

削除パスワード

No.29817

Re:ビットの回転
投稿者---初級階段(2007/02/22 16:59:36)


>
n7 n6 n5 n4 n3 n2 n1 n0
           ↓ 処理後
n0 n1 n2 n3 n4 n5 n6 n7

のようにしたい、という仕様ですか?


その通りです。私の考え方はまず各ビットは1か0かを確認して、0の場合はそのままシフトする。1の場合はローテート方式で処理する。そのロジックは思い浮べません。手伝っていただけますか?




この投稿にコメントする

削除パスワード

No.29818

Re:ビットの回転
投稿者---jazz(2007/02/22 17:12:11)


プログラムには
 ・入力
 ・処理
 ・出力
の各機能があります。
処理の具体的なロジックは別途考える(主体はご自身です)として、
入力と出力の仕様を明らかにしてください。

【入力仕様】
No.29816をご確認の上、提示してください。

【出力仕様】
No.29814の投稿にあったとおり、
1010 0000 ->0000 0101
のように、処理前・処理後の両ビット列を出力すればよいですか?


この投稿にコメントする

削除パスワード

No.29819

Re:ビットの回転
投稿者---初級階段(2007/02/22 17:20:40)


>プログラムには
> ・入力
> ・処理
> ・出力
>の各機能があります。
>処理の具体的なロジックは別途考える(主体はご自身です)として、
>入力と出力の仕様を明らかにしてください。
>
>【入力仕様】
>No.29816をご確認の上、提示してください。
>
>【出力仕様】
>No.29814の投稿にあったとおり、
>1010 0000 ->0000 0101
>のように、処理前・処理後の両ビット列を出力すればよいですか?

入力仕様は10進数で、出力仕様は両ビット列を出力したいんですが...



この投稿にコメントする

削除パスワード

No.29820

Re:ビットの回転
投稿者---jazz(2007/02/22 17:39:59)


>入力仕様は10進数で、出力仕様は両ビット列を出力したいんですが...

わかりました。
入力は十進数とのことですので、
「データを入力してください」のようなメッセージの後、
int型の変数に受け取る形でいいでしょうね。

出力は、念のため入力データを十進数で出力し、例えばこんな感じでは
いかがですか?(下記は入力データが160の場合です)
4桁ごとの空白は、さしあたり入れておりません。

160
10100000 -> 00000101


この投稿にコメントする

削除パスワード

No.29821

Re:ビットの回転
投稿者---初級階段(2007/02/23 10:39:54)


>>入力仕様は10進数で、出力仕様は両ビット列を出力したいんですが...
>
>わかりました。
>入力は十進数とのことですので、
>「データを入力してください」のようなメッセージの後、
>int型の変数に受け取る形でいいでしょうね。
>
>出力は、念のため入力データを十進数で出力し、例えばこんな感じでは
>いかがですか?(下記は入力データが160の場合です)
>4桁ごとの空白は、さしあたり入れておりません。
>
>160
>10100000 -> 00000101

#include <stdio.h>

void rotate(unsigned char *c)
{
union {
unsigned char ch[2];
unsigned u;
} rot;

rot.u = 0;

rot.ch[0] = *c;

rot.u = rot.u << 1;

if(rot.ch[1]) rot.ch[0] = rot.ch[0] | 1;

*c = rot.ch[0];
}

int main(void)
{
unsigned char ch;
int i,j;

printf("数字を入力してください:");
scanf("%d",&ch);

for(j=0;j<8;j++){
rotate(&ch);

if(j=1)
{
printf("%d",(ch & 0x10) ? (1) : (0));
printf("%d",(ch & 0x01) ? (1) : (0));

}

if(j=3)
{
printf("%d",(ch & 0x20) ? (1) : (0));
printf("%d",(ch & 0x02) ? (1) : (0));
}

if(j=5)
{
printf("%d",(ch & 0x40) ? (1) : (0));
printf("%d",(ch & 0x04) ? (1) : (0));
}

if(j=7)
{
printf("%d",(ch & 0x80) ? (1) : (0));
printf("%d",(ch & 0x08) ? (1) : (0));
}
}

return 0;
}
どこに問題があるのか教えていただけますか?



この投稿にコメントする

削除パスワード

No.29823

Re:ビットの回転
投稿者---jazz(2007/02/23 10:53:34)


>どこに問題があるのか教えていただけますか?

パッと見て気付くのは、if文の条件です。
等号が1個ではまずいでしょうね。

それから、問題をむずかしく考えすぎているように思います。
元の数のいちばん右のビットを取り出しては出力する、
ということを繰り返せば、変換後の結果が出ます。
いちばん右のビットを取り出すのは、2で割ったあまりを求めることと等価です。

なお、ソースコードは、HTML変換ツールで字下げしてから投稿してください。


この投稿にコメントする

削除パスワード

No.29824

Re:ビットの回転
投稿者---初級階段(2007/02/23 11:10:29)


>>どこに問題があるのか教えていただけますか?
>
>パッと見て気付くのは、if文の条件です。
>等号が1個ではまずいでしょうね。
>
>それから、問題をむずかしく考えすぎているように思います。
>元の数のいちばん右のビットを取り出しては出力する、
>ということを繰り返せば、変換後の結果が出ます。
>いちばん右のビットを取り出すのは、2で割ったあまりを求めることと等価です。
>
>なお、ソースコードは、HTML変換ツールで字下げしてから投稿してください。
ありがごうございます。


この投稿にコメントする

削除パスワード

No.29833

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 16:52:34)
http://park6.wakwak.com/~nougaki/mini_program/


>私の考え方はまず各ビットは1か0かを確認して、0の場合はそのままシフトする。1の場合はローテート方式で処理する。そのロジックは思い浮べません。手伝っていただけますか?

意味がわからない。


この投稿にコメントする

削除パスワード

No.29842

ローテート
投稿者---ルナレルナ(2007/02/24 12:12:28)
http://park6.wakwak.com/~nougaki/mini_program/


ローテート
http://wisdom.sakura.ne.jp/programming/asm/assembly20.html


この投稿にコメントする

削除パスワード

No.29843

Re:ローテート
投稿者---ルナレルナ(2007/02/24 21:18:20)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	ロケットペンシル思い出す
//

#include <stdio.h>

int main(void)
{
    unsigned char uc = 0xa0;
    
    printf("%3d %3o %2x\n", uc, uc, uc);
    
    if (uc & 0x80)
        uc = uc << 1 | 0x01;
    else
        uc = uc << 1;
        
    printf("%3d %3o %2x\n", uc, uc, uc);
    
    if (uc & 0x01)
        uc = uc >> 1 | 0x80;
    else
        uc = uc >> 1;
        
    printf("%3d %3o %2x\n", uc, uc, uc);
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29864

Re:循環シフト
投稿者---ルナレルナ(2007/02/28 23:58:21)
http://park6.wakwak.com/~nougaki/mini_program/


ローテート以外でも、
「ビットの循環」、「循環シフト」
というキーワードで検索したところ、
それらしい内容の記述があった。


この投稿にコメントする

削除パスワード

No.29865

Re:ビットの回転
投稿者---ルナレルナ(2007/03/01 00:13:09)
http://park6.wakwak.com/~nougaki/mini_program/


>>
n7 n6 n5 n4 n3 n2 n1 n0
           ↓ 処理後
n0 n1 n2 n3 n4 n5 n6 n7

のようにしたい、という仕様ですか?


>その通りです。


本当にそうなのだろうか?

n7 n6 n5 n4 n3 n2 n1 n0
	↓ 処理後
n4 n3 n2 n1 n0 n7 n6 n5


のような気がする。




この投稿にコメントする

削除パスワード

No.29825

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 13:07:25)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	これをビットの回転というのだろうか?
//

int main(void)
{
    unsigned char uc = 0xa0;
    
    putchar(uc & 0x80 ? '1' : '0');
    putchar(uc & 0x40 ? '1' : '0');
    putchar(uc & 0x20 ? '1' : '0');
    putchar(uc & 0x10 ? '1' : '0');
    putchar(uc & 0x08 ? '1' : '0');
    putchar(uc & 0x04 ? '1' : '0');
    putchar(uc & 0x02 ? '1' : '0');
    putchar(uc & 0x01 ? '1' : '0');
    
    putchar('\n');
    
    putchar(uc & 0x01 ? '1' : '0');
    putchar(uc & 0x02 ? '1' : '0');
    putchar(uc & 0x04 ? '1' : '0');
    putchar(uc & 0x08 ? '1' : '0');
    putchar(uc & 0x10 ? '1' : '0');
    putchar(uc & 0x20 ? '1' : '0');
    putchar(uc & 0x40 ? '1' : '0');
    putchar(uc & 0x80 ? '1' : '0');
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29826

Re:ビットの回転
投稿者---初級階段(2007/02/23 13:43:32)


ありがとうございます。


この投稿にコメントする

削除パスワード

No.29834

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 16:57:53)
http://park6.wakwak.com/~nougaki/mini_program/


>ありがとうございます。

問題は全く解決していない。
未だ問題にすら至っていない。
問題に至らない状態で、要望と良くわからない感謝の言葉はいりません。


この投稿にコメントする

削除パスワード

No.29827

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 14:17:46)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	ループへのホップ
//

int main(void)
{
    unsigned char uc = 0xa0;
    
    putchar(uc & 0x80 >> 0 ? '1' : '0');
    putchar(uc & 0x80 >> 1 ? '1' : '0');
    putchar(uc & 0x80 >> 2 ? '1' : '0');
    putchar(uc & 0x80 >> 3 ? '1' : '0');
    putchar(uc & 0x80 >> 4 ? '1' : '0');
    putchar(uc & 0x80 >> 5 ? '1' : '0');
    putchar(uc & 0x80 >> 6 ? '1' : '0');
    putchar(uc & 0x80 >> 7 ? '1' : '0');
    
    putchar('\n');
    
    putchar(uc & 0x01 << 0 ? '1' : '0');
    putchar(uc & 0x01 << 1 ? '1' : '0');
    putchar(uc & 0x01 << 2 ? '1' : '0');
    putchar(uc & 0x01 << 3 ? '1' : '0');
    putchar(uc & 0x01 << 4 ? '1' : '0');
    putchar(uc & 0x01 << 5 ? '1' : '0');
    putchar(uc & 0x01 << 6 ? '1' : '0');
    putchar(uc & 0x01 << 7 ? '1' : '0');
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29828

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 14:21:24)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	ステップとんでループへ
//

int main(void)
{
    unsigned char uc = 0xa0;
    int i;
    
    for (i = 0; i < 8; i++)
        putchar(uc & 0x80 >> i ? '1' : '0');
    
    putchar('\n');
    
    for (i = 0; i < 8; i++)
        putchar(uc & 0x01 << i ? '1' : '0');
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29829

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 14:26:04)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	往復
//

int main(void)
{
    unsigned char uc = 0xa0;
    int i;
    
    for (i = 0; i < 8; i++)
        putchar(uc & 0x80 >> i ? '1' : '0');
    
    putchar('\n');
    
    for (--i; i >= 0; i--)
        putchar(uc & 0x80 >> i ? '1' : '0');
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29831

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 14:31:35)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	往復2
//

int main(void)
{
    unsigned char uc = 0xa0;
    int i;
    
    for (i = 7; i >= 0; i--)
        putchar(uc & 1 << i ? '1' : '0');
    
    putchar('\n');
    
    for (i++; i < 8; i++)
        putchar(uc & 1 << i ? '1' : '0');
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.29832

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 14:55:41)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	いろいろなパターンを試してみる。
//

void print_bin(int n);
char *str_bin(int n);

int main(void)
{
    int n;
    
    scanf("%d", &n);
    
    if (n < 0 || n > 255)
        return 1;
        
    //	普通に表示
    printf("%d\n", n);
    
    //	例えば代わりに
    print_bin(n);
    
    //	もしくわ代わりに
    puts(str_bin(n));
    
    return 0;
}


void print_bin(int n)
{
    int i;
    
    for (i = 0; i < 8; i++)
        putchar(n & 0x80 >> i ? '1' : '0');
    putchar('\n');
}


char *str_bin(int n)
{
    static char s[9] = "";
    int i;
    
    for (i = 0; i < 8; i++)
        s[i] = n & 0x80 >> i ? '1' : '0';
        
    return s;
}



この投稿にコメントする

削除パスワード

No.29835

Re:ビットの回転
投稿者---初級階段(2007/02/23 16:58:55)


大変ありがとうございます。

すいませんが、CUPを一回しか処理させない方法がありますか?


この投稿にコメントする

削除パスワード

No.29837

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 17:29:54)
http://park6.wakwak.com/~nougaki/mini_program/


>すいませんが、CUPを一回しか処理させない方法がありますか?

何をどうするため方法?
CUPってなに?
なぜ一回に縛られなければならないのか?


この投稿にコメントする

削除パスワード

No.29866

Re:ビットの回転
投稿者---かずま(2007/03/01 13:08:16)


> すいませんが、CUPを一回しか処理させない方法がありますか?

CUP って何ですか?
ループさせないという意味なら、いくつか方法を挙げておきます。
unsigned char bit_rev1(unsigned char x)
{
    return x<<7&128|x<<5&0x64|x<<3&32|x<<1&16|x>>1&8|x>>3&4|x>>5&2|x>>7;
}

unsigned char bit_rev2(unsigned char data)
{
    data = data >> 4 & 0x0f | data << 4 & 0xf0;
    data = data >> 2 & 0x33 | data << 2 & 0xcc;
    return data >> 1 & 0x55 | data << 1 & 0xaa;
}

unsigned char bit_rev3(unsigned char data)
{
    #define T0(x) T1(x),T1(x+1)
    #define T1(x) T2(x),T2(x+2)
    #define T2(x) T3(x),T3(x+4)
    #define T3(x) T4(x),T4(x+8)
    #define T4(x) T5(x),T5(x+16)
    #define T5(x) T6(x),T6(x+32)
    #define T6(x) T7(x),T7(x+64)
    #define T7(x) x,x+128
    static unsigned char t[] = { T0(0) };
    return t[data];
}



この投稿にコメントする

削除パスワード

No.29931

Re:ビットの回転
投稿者---ルナレルナ(2007/03/13 15:01:03)
http://park6.wakwak.com/~nougaki/mini_program/


unsigned char bit_rev1(unsigned char x)の中で、
x<<5&0x64の部分は、正しくはx<<5&64ですね。


この投稿にコメントする

削除パスワード

No.29942

Re:ビットの回転
投稿者---かずま(2007/03/14 02:05:21)


> unsigned char bit_rev1(unsigned char x)の中で、
> x<<5&0x64の部分は、正しくはx<<5&64ですね。

そうです。
ちゃんと読んでくれる人がいて、うれしく思います。
それにしても、CUP って何だろう?


この投稿にコメントする

削除パスワード

No.29836

Re:ビットの回転
投稿者---ルナレルナ(2007/02/23 17:00:35)
http://park6.wakwak.com/~nougaki/mini_program/


>ビットを回転したいですが...

ビットを回転するとはどういうことですか?

>例え:1010 0000 ->0000 0101のように出力したいんですが、どうすればいいですか?

printf("1010 0000 ->0000 0101");

どうして、1010 0000 ->0000 0101がビットを回転したことになるのですか?



この投稿にコメントする

削除パスワード

No.29839

Re:ビットの回転
投稿者---金魚ちゃん(2007/02/24 02:43:01)


n7 n6 n5 n4 n3 n2 n1 n0(処理前)
           ↓
n0 n1 n2 n3 n4 n5 n6 n7(処理後)

という仕様ならば、
タイトルは『ビット回転』ではなくて『ビット反転』ですね。これは。
それでロジックですが、下位ビットから順に『0』『1』を検査してそれを
左シフトでビット列を作成していけばよいと思います。

unsigned char bit_reverse( unsigned char data )
{
    unsigned char reverse = 0;
    int i;
    
    for ( i = 0 ; i < 8 ; i++ ){
        reverse <<= 1;
        
        if ( data & (1 << i) ){
            reverse |= 1;
        }
        else{
            reverse |= 0; ←特に必要ないが記述(削除しても良い)
        }
    }
    return( reverse );
}
上記の『bit_reverse』関数の引数が処理前のデータ、戻り値が処理後のデータになります。
あとはビット出力を『printf』関数などで出力すればよい。
以上。




この投稿にコメントする

削除パスワード

No.29862

Re:ビットの回転
投稿者---初級階段(2007/02/28 17:56:26)


金魚ちゃんが書いたソースコードでどこか反転しているのかを教えていただけますか?私はその反転の動きがソースコードで見つからなかった。


この投稿にコメントする

削除パスワード

No.29863

Re:ビットの回転
投稿者---Hermit(2007/02/28 21:12:37)


>金魚ちゃんが書いたソースコードでどこか反転しているのかを教えていただけますか?私はその反転の動きがソースコードで見つからなかった。
0 〜 7 になるまでに、i << i で、チェックするビットが移動してますよね。
ついでに、
reverse が、チェックするとき、ひとつずつ 1 bit シフトしてますよね。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧