掲示板利用宣言

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

 私は

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

掲示板2

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

No.23605

マスクとは?
投稿者---がりんしゃ(2005/10/14 21:24:15)


入力した値の下位2ビットをマスクするとは、どういう操作を行えば良いのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:マスクとは? 23607 ぽへぇ 2005/10/14 21:52:29
<子記事> 符号変換の為の2進数表記 23678 がりんしゃ 2005/10/18 02:00:13
<子記事> 参考までに 23681 nop 2005/10/18 10:41:22


No.23607

Re:マスクとは?
投稿者---ぽへぇ(2005/10/14 21:52:29)


>下位2ビットをマスクする
ということがどういうことか、具体例を(ひとつだけでもいいので)
挙げて説明できますか?

その後、
http://www9.plala.or.jp/sgwr-t/c/sec14.html
を一通りみてください。

それでも分からなければ改めて質問してください。
次からは利用上の注意をよく守って書き込むように。




この投稿にコメントする

削除パスワード

No.23613

Re:マスクとは?
投稿者---がりんしゃ(2005/10/15 16:16:38)


言葉が足りず申し訳ありませんでした。

マスクというのは、
10101111
11111111
の論理積をとるようなことを言いますよね?
論理積をとって調べたいビットだけを取り出す。という風に解釈しておりました。

この場合下位2ビットのマスクをとるというのは、
下位2ビットの部分だけを0で論理積をとるということですか?
(10101111、11111100の論理積が10101100となるように。)

このマスクをとる為のプログラムがよくわからないのです。

入力した値の下位2ビットのマスクを取らなければならないのですが、この場合、まず入力した値を2進数に変換しなけらばなりませんよね?
その後、その値の下位2ビットをマスクするのですが、2進数に変換するためのプログラムから苦戦しているものでよくわからないのです・・・。

宜しくお願い致します。


この投稿にコメントする

削除パスワード

No.23614

Re:マスクとは?
投稿者---とおり(2005/10/15 16:37:18)


>入力した値の下位2ビットのマスクを取らなければならないのですが、この場合、まず入力した値を2進数に変換しなけらばなりませんよね?

違います。
コンピュータの中では、どんな数値も2進数で扱われているのです。
なので、普通にint型の値を使って、論理演算すればよいのです。
試しに、13 & 7 の結果でも見てみるとわかるでしょう。


この投稿にコメントする

削除パスワード

No.23615

Re:マスクとは?
投稿者---ぽへぇ(2005/10/15 17:15:38)


>(10101111、11111100の論理積が10101100となるように。)
私の示したリンク先はすでに見ていただいたとして
この例で書くと、

unsigned long aval = 0xaf;
unsigned long mask = 0xfc;
unsigned long ans  = aval & mask;
printf("0x%x\n", ans);

実行結果:
0xac

>2進数に変換するためのプログラム
もしかして2進数表記での代入や表示を考えていますか?




この投稿にコメントする

削除パスワード

No.23626

Re:マスクとは?
投稿者---まきじ(2005/10/15 23:15:52)


>下位2ビットの部分だけを0で論理積をとるということですか?

1 の部分は 1 に 0 の部分は 0 にしなければならないので
取り出したいビットの部分だけ 1 にして論理積をとります。


この投稿にコメントする

削除パスワード

No.23630

Re:マスクとは?
投稿者---がりんしゃ(2005/10/16 00:41:31)


とおりさん、ぽへぇさん、まきじさん、ありがとうございます。

>コンピュータの中では、どんな数値も2進数で扱われているのです。
>なので、普通にint型の値を使って、論理演算すればよいのです。

コンピュータの中ではどんな数値も2進で扱われているというのは知っていましたが、
どのようにやればいいのかわからず、
入力した値を2で割る、さらに商を2で割るを繰り返し、余りを配列に詰め込んでいって、配列を逆から表示させていくという、
強引に2進数表記させるプログラムを作っていました・・・。


>もしかして2進数表記での代入や表示を考えていますか?

そうです。
ただ、計算途中に2進数で表示しなければならないという条件はないのですが、
最終的には、2進、10進、16進で表示させなければならないのです。
10進はそのままですし、16進は%xを使えば表示できますよね。
マスクする段階で2進に変換する必要がないのはわかるんですが、最終的には2進表記させたいんです。


>1 の部分は 1 に 0 の部分は 0 にしなければならないので
>取り出したいビットの部分だけ 1 にして論理積をとります

ぽへぇさんに教えていただいたサイトをみると、
・必要なビット以外をOFF(0)にする処理をマスクする
という記述がありました。
今私がしたいのは「下位2ビットをマスクする」という処理なのですが、
この場合、要するに下位2ビットだけに0のandをとれば良いということですよね?
10101111  ←元の値
11111100 ←下位2ビットをマスク
--------
10101100 ←マスクした結果
これで合ってますか?


長文になってしまうのですが、私がしたいことを整理して書くと、
1、scanfで値を読みこむ
2、読み込んだ値の下位2ビットをマスクする
3、マスクした値で4パターンの加工を施す
・マスクした値 4パターンの処理
値:0 符号変換(+、−を逆に)
値:1 値を5倍にする
値:2 値を1/4にする
値:その他 値を0にする
・条件
マスクした値で処理を分岐する際にswitchを使う
計算を行う場合に、演算子(/,*)を使ってはいけない。シフトを使用して計算する。

今の段階で理解できたと思ってるのは2、までです。
3、が何をすれば良いのか全くわかりません。。

ちなみに環境はWindowsでVisualC++を使ってます。
宜しくお願いします。

長文になってしまい申し訳ありませんでした。



この投稿にコメントする

削除パスワード

No.23632

Re:マスクとは?
投稿者---KING・王(2005/10/16 01:11:11)


>値:0 符号変換(+、−を逆に)
最上位ビットが符号になっているので、
その値が1の場合は0に、0の場合は1にする。

>値:2 値を1/4にする
整数の値を右に1シフトすると、元の値の2分の1になりますので、
右に2シフトする。
(ただし、符号を考慮する必要あるかも?)

>値:その他 値を0にする
え〜と、0を代入するはだめですか?

>値:1 値を5倍にする
これは少し分かりかねます。
とりあえず、単純に元の値を5回足すのはだめですか?



この投稿にコメントする

削除パスワード

No.23633

Re:マスクとは?
投稿者---まきじ(2005/10/16 01:11:39)


>・必要なビット以外をOFF(0)にする処理をマスクする
>要するに下位2ビットだけに0のandをとれば良いということですよね?

良いです・・

# 余計な事云って混乱させてしまいました。すいません。

>値:0 符号変換(+、−を逆に)

最上位ビットが符号ビットなので 0 と 1 を反転させてやれば良いです。

>値:1 値を5倍にする

左に一つシフトすれば 2 倍になります。

>値:2 値を1/4にする

右に一つシフト 1/2 倍になります。

>値:その他 値を0にする

同じ値で XOR を取るとか


この投稿にコメントする

削除パスワード

No.23634

Re:マスクとは?
投稿者---RAPT(2005/10/16 01:22:46)


>>値:1 値を5倍にする
>
>左に一つシフトすれば 2 倍になります。

a += a << 2;




この投稿にコメントする

削除パスワード

No.23654

Re:マスクとは?
投稿者---RiSK(2005/10/16 20:45:47)


> a += a << 2;

未定義動作っぽいですね。
式を分けないとダメです。


この投稿にコメントする

削除パスワード

No.23656

Re:マスクとは?
投稿者---RAPT(2005/10/16 22:41:06)


>> a += a << 2;
>
>未定義動作っぽいですね。
>式を分けないとダメです。

あれ? そうなんですか。では、
a = a + a << 2;
とかすればいいんですね。



この投稿にコメントする

削除パスワード

No.23657

Re:マスクとは?
投稿者---RiSK(2005/10/16 22:47:02)


>あれ? そうなんですか。

あ゛ー。間違った…。

>a = a + a << 2;

この変換をみて,間違いに気がつきました。

>all
No.23654は撤回します。ごめんなさい。


この投稿にコメントする

削除パスワード

No.23647

Re:マスクとは?
投稿者---とろり(2005/10/16 11:57:47)


>値:1 値を5倍にする

これはRAPTさんが示されたやり方が出題者が求める正解のような気がします。(aの4倍+aはaの5倍)

ざっくりみてこれは、コンピュータ内部では四則演算は全部足し算でおこなわれている(半分うそ)。ということを理解するための例題の気がします。

皆さんが示されているとおりでの方法で解答して良いのではないでしょうか?


この投稿にコメントする

削除パスワード

No.23648

Re:マスクとは?
投稿者---がりんしゃ(2005/10/16 13:49:08)


みなさんありがとうございます。

マスクした後に何をすればいいのかはわかりました。
シフトするだけで符号を変えたり、2倍したりできるんですね。

ただ、未だわからない点が1つあります。

>3、マスクした値で4パターンの加工を施す
>・マスクした値 4パターンの処理
>値:0 符号変換(+、−を逆に)
>値:1 値を5倍にする
>値:2 値を1/4にする
>値:その他 値を0にする

ここで言っているマスクした値というのは何のことを差しているのでしょうか?
101011 11 ←ここの下位2ビットのことなのでしょうか?
111111 00
------ --
101011 00
この例の場合11で3であるから、値:その他?
宜しくお願い致します。


この投稿にコメントする

削除パスワード

No.23649

Re:マスクとは?
投稿者---まきじ(2005/10/16 14:21:16)


>この例の場合11で3であるから、値:その他?

10101111 と 11111100 の AND の結果の 10101100 です。


この投稿にコメントする

削除パスワード

No.23651

Re:マスクとは?
投稿者---ぽへぇ(2005/10/16 17:52:44)


>ただ、未だわからない点が1つあります。
>ここで言っているマスクした値というのは何のことを差しているのでしょうか?
出題者に聞いてみては?

>101011 11 ←ここの下位2ビットのことなのでしょうか?
>111111 00
>------ --
>101011 00

(後で使うswitchから想像するに)下位2bitだけを
取り出すのが目的なら、マスク値は(111111 00ではなくて)
    000000 11
なのかも。

またがりんしゃさんの例で書けば、
>値:1 値を5倍にする
10101111 を5倍するのか、10101100 を5倍するのか、
どっちなんでしょう?




この投稿にコメントする

削除パスワード

No.23652

Re:マスクとは?
投稿者---がりんしゃ(2005/10/16 19:19:40)


ありがとうございます。

マスクした値に、値の違いによって違う加工を施すということは、
色々な値が出るということになりますよね?
この場合は、
10101111 ←
11111100 ←
--------
10101100 ←

switchの時に区別する値を、
,硫式2ビットで区別すると、これは入力する値によって変わるから、値は様々な値になる。
△硫式2ビットで区別すると、△魯泪好処理なので下位2ビットは必ず00(?)なので値に変化がない。
の下位2ビットで区別すると、マスク後の処理なので必ず00(?)になってしまうので変化がない。

という風に私は思ったのです。

ぽへぇさんのおっしゃった、
>(後で使うswitchから想像するに)下位2bitだけを
>取り出すのが目的なら、マスク値は(111111 00ではなくて)
>000000 11なのかも。
だと、
マスク後でもの下位2ビットの値は様々な値になるので、これなのかもしれません・・・。

>>値:1 値を5倍にする
>10101111 を5倍するのか、10101100 を5倍するのか、
>どっちなんでしょう?
問題の日本語から判断するに10101100を5倍にするのだと思っていますが・・・。(マスク後の値に加工を施す)


>>この例の場合11で3であるから、値:その他?
>
>10101111 と 11111100 の AND の結果の 10101100 です。

これは10101100全体を指しているということなのでしょうか?


以前一度整理して私がしたいことを書いた時に、問題はほぼ修正せずに書いたので、日本語のわかりにくさということなのでしょうかね。。。




この投稿にコメントする

削除パスワード

No.23653

Re:マスクとは?
投稿者---まきじ(2005/10/16 20:19:08)


>マスクした値に、値の違いによって違う加工を施すということは、
>色々な値が出るということになりますよね?

マスクされる対象(10101111)の数値や
マスクする数値(11111100)が変われば
結果も当然変わります。

>switchの時に区別する値を、

何を区別するのでしょうか?

>これは10101100全体を指しているということなのでしょうか?

マスクは、特定のビットを 0 にする処理(0 で隠してしまう)なので
10101111 の下位 2bit をマスク処理するということは
下位 2bit を 0 にするということです。
下位 2bit を 0 にするには 11111100 と AND を取れば良い。
その結果がマスクした値です。
つまり 10101100 がマスクした値になります。


この投稿にコメントする

削除パスワード

No.23655

Re:マスクとは?
投稿者---RiSK(2005/10/16 21:55:48)


勉強中のasmを意識して:
符号反転は二の補数が前提です。
#include <stdlib.h>
#include <stdio.h>
#define USAGE "値:0 符号変換(+、−を逆に)\n"\
    "値:1 値を5倍にする\n"\
    "値:2 値を1/4にする\n"\
    "値:その他 値を0にする"
void PrintBinary(int n) {
    div_t d = div(n, 2);
    if (d.quot) PrintBinary(d.quot);
    putchar(d.rem ? '1' : '0');
}
void Print(int n) {
    printf("十進:%4d 十六進:%x 二進:", n, n);
    PrintBinary(n); putchar('\n'); putchar('\n');
}
void MaskLowOrder2Bits(int * n) {
    *n &= ~0 ^ 3;
}
void Negative(int * n) {
    *n = ~*n;
    ++*n;
}
void MultiplyBy5(int * n) {
    int tmp = *n << 2;
    tmp += *n;
    *n = tmp;
}
void DivideBy4(int * n) {
    *n >>= 2;
}
void Move0(int * n) {
    *n ^= *n;
}
int main(void) {
    int n, pattern;
    printf("値(十進):"); if (scanf("%d", &n) != 1) return 1;
    puts("のーまる"); Print(n);
    MaskLowOrder2Bits(&n);
    puts("ますく"); Print(n);
    printf(USAGE "\nパターン:"); if (scanf("%d", &pattern) != 1) return 2;
    switch (pattern) {
    case 0: puts("符号変換"); Negative(&n); break;
    case 1: puts("* 5"); MultiplyBy5(&n); break;
    case 2: puts("/ 4"); DivideBy4(&n); break;
    default: puts("= 0"); Move0(&n); break;
    }
    Print(n);
    return 0;
}



この投稿にコメントする

削除パスワード

No.23659

Re:マスクとは?
投稿者---とおり(2005/10/17 00:17:32)


>void Negative(int * n) {
> *n = ~*n;
> ++*n;
>}

negate命令を持っている命令セットは少なくないと思うので
自力で補数計算するのは微妙かも…
# IA32, PowerPCはあり。


この投稿にコメントする

削除パスワード

No.23670

Re:マスクとは?
投稿者---がりんしゃ(2005/10/17 14:28:10)


かなり問題の日本語がわかりにくいので出題者に何を意味しているのか確認してみます。。。他の人が見ればわかるのかもしれませんが私にとっては不明瞭なので。。。

asmでは作っていませんが、かなりそのままなので参考にさせていただきます。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.23678

符号変換の為の2進数表記
投稿者---がりんしゃ(2005/10/18 02:00:13)


マスクについては解決いたしました。

10101111 ←入力した値
00000011 ←マスク処理
--------
00000011 ←マスク後の値

が正しく、下位2ビットの値によって4パターンの加工を施す為の、その値とはマスク後の値の下位2ビットでした。
その後、入力した値に、符号変換、5倍、1/4倍、0にするの加工を施すようです。

そこで、符号変換を行う為に2進数に変換したいのです。
作ったプログラムはこのような感じです。

#include<stdio.h>

main(){
    int value,aftermask,mask(int);

    printf("value = ");
    scanf("%d",&value);//値を入力
    aftermask = value & 3;// _式2ビットをマスク
    printf("%d\n",aftermask);

    mask(value);
    printf("%d\n",value);//
}

int mask(int value){
    int i,n;
    int answer[32],rest[32];

    answer[0] = value;      

    for(i=0;;i++){
        answer[i+1] = answer[i]/2; 
        rest[i] = answer[i] - answer[i+1]*2;
        if(answer[i+1]==0){
            n = i;           //何番目の配列まで余りが入ったかをnに入れておく
            break;
        }
    }

    for(i=n;i>=0;i--){
        printf("%d",rest[i]);//◆n番目から逆に配列を並べる
    }
    printf("\n");
    return(rest[i]);// valueに返す
}


このプログラムでの問題点が、
1、,硫式2ビットのマスクの取り方はこれでよいのか。

2、△rest[i]を出力したときは配列に入っている余りの1か0が並んで出力されるが、のreturn(rest[i]);で値をvalueに返したとき、い任int value なのでrest[i]に入っている配列がそのまま出力されずに、10進表記に直ってvalueそのままの値で出力されてしまうので、い良分で2進表記したい。

3、2の補数を求めるために、r進数n桁の数xのrの補数は(r^n-x)なので、2進数に変換したときの桁数が知りたいが、どうすればよいのかわからない。

4、このプログラムだと、
10進:7→2進:111で表記は111だが、00000111に。
10進:300→2進:100101100で表記は100101100だが、00000001 00101100に。
のように8ビットごとの表記にしたい。

かなり穴だらけなプログラムかもしれませんが、修正点を宜しくお願い致します。



この投稿にコメントする

削除パスワード

No.23679

Re:符号変換の為の2進数表記
投稿者---まきじ(2005/10/18 08:15:50)


>1、,硫式2ビットのマスクの取り方はこれでよいのか。

よいです。

>2、のreturn(rest[i]);で値をvalueに返したとき、
return の前の for(i=n;i>=0;i--) で i は -1 になって for
を抜けますので value[-1] を返すことになります。

>い任int value なのでrest[i]に入っている配列がそのまま出力されずに、10進表記に直ってvalueそのままの値で出力されてしまうので、
>い良分で2進表記したい。

rest に 0 1 を格納してるのですから の様に逆順で表示すれば良い。

>3、2の補数を求めるために、r進数n桁の数xのrの補数は(r^n-x)なので、2進数に変換したときの桁数が知りたいが、どうすればよいのかわからない。

の様に表示する代わりに 0 1 をカウントすれば良い。

>10進:7→2進:111で表記は111だが、00000111に。
>10進:300→2進:100101100で表記は100101100だが、00000001 00101100に。
>のように8ビットごとの表記にしたい。

int rest[32] と宣言して 0 に初期化しといて
rest[31] から rest[0] まで表示する際 8bit 表示ごとに空白を
表示すれば良い。

# の様な機種依存文字を使わない様に。


この投稿にコメントする

削除パスワード

No.23729

Re:符号変換の為の2進数表記
投稿者---まきじ(2005/10/19 23:17:54)


>>1、,硫式2ビットのマスクの取り方はこれでよいのか。
>よいです。

すいません、間違ってました・・
マスクだから & 3 では駄目です。
& 3 だと下位 2 bit を取り出す処理になる。


この投稿にコメントする

削除パスワード

No.23680

Re:符号変換の為の2進数表記
投稿者---shu(2005/10/18 10:08:43)


>マスクについては解決いたしました。

多分、解決していません。

>このプログラムでの問題点が、
>1、,硫式2ビットのマスクの取り方はこれでよいのか。

がりんしゃさんが判断しなければ駄目です。
その判断材料として、回答があります。

ほとんどが、がりんしゃさん宛ての回答なので、
自分では良く目を通していませんが、
マスクについての説明も、2進数表記についても、
いままでの回答から、十分に導けました。


この投稿にコメントする

削除パスワード

No.23681

参考までに
投稿者---nop(2005/10/18 10:41:22)


◆マスク (MASK)

 仮面や覆面などを意味する英単語で、
 転じて、プログラミングに於いては、
 不要なデータを見えなくする、と言う操作を意味します。

 例えば、不要なビットを全て0に、
 または、不要なビットを全て1に、
 と言う操作がよく使用されます。



この投稿にコメントする

削除パスワード

No.23704

Re:参考までに
投稿者---がりんしゃ(2005/10/18 19:32:27)


まきじさん、nopさんありがとうございます。
参考にさせていただきます。

>>マスクについては解決いたしました。
>多分、解決していません。
解決していないというのはどういうことでしょうか??


この投稿にコメントする

削除パスワード

No.23726

Re:参考までに
投稿者---shu(2005/10/19 20:54:35)


>解決していないというのはどういうことでしょうか??

特に、No.23678の書き込みの後半部分で、

>このプログラムでの問題点が、
>1、,硫式2ビットのマスクの取り方はこれでよいのか。

と、書かれていたので、解決していないと判断しました。


この投稿にコメントする

削除パスワード

No.23766

Re:参考までに
投稿者---がりんしゃ(2005/10/21 13:00:30)


>すいません、間違ってました・・
>マスクだから & 3 では駄目です。
>& 3 だと下位 2 bit を取り出す処理になる。

やはりそうなんですよねぇ。
聞いておいて変な話なんですが、私自身もそういう解釈をしておりました。
□ & 3
という処理をすると、□の下位2ビットを取り出すということですよね。
□=10101111 なら、
10101111 
00000011
-------- 
00000011
ということになりますよね。
これが違うということは、これの逆ということになる。
要するに下位2ビットのマスクというのは、
10101111
11111100
--------
10101100
ということだと思ったので出題者に直接聞いてみたところ、
来た返信というのが、
---------------------------------
下位2ビットマスクの方法を勘違いしているのではないでしょうか?
10101111 ←‘力した値
11111100 ←▲泪好処理
→00000011 の誤りですね
--------
10101100 ←マスク後の値
→00000011 となります
---------------------------------
と返信されてきました。

>>解決していないというのはどういうことでしょうか??
>>このプログラムでの問題点が、
>>1、,硫式2ビットのマスクの取り方はこれでよいのか。
>
>と、書かれていたので、解決していないと判断しました。

始めにここで聞いたときは、教えていただいたサイトを見たりして、マスク処理は11111100だという考えになり、出題者にも聞いてみたところ00000011が正しいという風に言われたので非常に混乱しました。
出題者が00000011だと言うのですから、出題者の意図するのはこちらなのでしょうけれども、「マスクをとる」という言葉が2通りの意味を成しているはずがないと思い、再びここでみなさんに確認したく質問しました。

ちなみに、ここで教えていたたいだサイトの言葉をそのまま使うと、
>必要なビット以外をOFF(0)にする処理(マスクといいます)に使用されま>す。
>例えば、10101010 という1バイトのビット列の下位4ビットを OFF する場>合、そのままにしたいビットを 1 、OFFしたいビットを 0 にした、>11110000 で and することにより実現できます。

とありました。
出題された問題は、「入力した値の下位2ビットマスクをとり、〜」となってます。
上の文章でいうと、
マスクをとる=必要なビット以外をOFF(0)にする
下位2ビットのマスクをとる=下位2ビットをOFF(0)にする
このように解釈されるにも関わらず、出題者には違うということを言われたということです。


この投稿にコメントする

削除パスワード

No.23767

Re:参考までに
投稿者---REE(2005/10/21 13:30:34)


>出題された問題は、「入力した値の下位2ビットマスクをとり、〜」となってます。
>上の文章でいうと、
>マスクをとる=必要なビット以外をOFF(0)にする
>下位2ビットのマスクをとる=下位2ビットをOFF(0)にする
>このように解釈されるにも関わらず、出題者には違うということを言われたということです。

下位2ビットを必要と考えると以下の解釈も可能です。
マスクをとる=必要なビット以外をOFF(0)にする
下位2ビットのマスクをとる=下位2ビット以外をOFF(0)にする

「○○のマスクをとる」という表現は
「○○の部分をマスクする」場合と、「○○の部分を取り出すために他をマスクする」場合とで
結構あいまいに使われていると思うので、出題者の意図通りの解釈で進めたほうがいいでしょう。



この投稿にコメントする

削除パスワード

No.23770

Re:参考までに
投稿者---がりんしゃ(2005/10/21 16:23:39)


>「○○のマスクをとる」という表現は
>「○○の部分をマスクする」場合と、「○○の部分を取り出すために他をマスクする」場合とで
>結構あいまいに使われていると思うので、出題者の意図通りの解釈で進めたほうがいいでしょう。

あいまいなんですか・・・。混乱するわけだ・・・。
「○○をマスクする」と言ったら、そのビットをOFF(0)にすることで、
「○○の部分を取り出すために他をマスクする」というのが「○○のマスクをとる」ということなんですね。
今回は「下位2ビットのマスクをとる」だから00000011だということですか。
理解できました。
ありがとうございました。



この投稿にコメントする

削除パスワード

No.23777

Re:参考までに
投稿者---ぽへぇ(2005/10/21 18:27:46)



>今回は「下位2ビットのマスクをとる」だから00000011だということですか。

 今回のやりとりで(がりんしゃさんも含め)掲示板のみなさんが
どれだけ混乱したかを考えれば、「下位2ビットのマスクをとる」が
「00000011」につながるとは考えにくいです。

課題は課題(出題者の意図)として、自分が出題者だったら
どう表現するか、どう表現されたら理解できたのか。
それを考えるのも大切だと思います。



この投稿にコメントする

削除パスワード

No.23780

Re:参考までに
投稿者---まきじ(2005/10/21 23:30:42)


>今回は「下位2ビットのマスクをとる」だから00000011だということですか。

1/4 倍などがある点からして、11111100 との AND だと思いますが?
下位 2 bit 取って 1/4 倍しても 0 になるだけですし・・・


この投稿にコメントする

削除パスワード

No.23784

Re:参考までに
投稿者---ぽへぇ(2005/10/22 07:47:29)


まきじ さん
>1/4 倍などがある点からして、11111100 との AND だと思いますが?
>下位 2 bit 取って 1/4 倍しても 0 になるだけですし・・・

ANDをとる前の値(入力値)を1/4倍する、という可能性が残っています。
「仕様のわかりにくさを指摘する」という課題なのかもしれないですね。

>来た返信というのが、
>下位2ビットマスクの方法を勘違いしているのではないでしょうか?
>→00000011 の誤りですね
とある以上、相手(出題者/上司/クライアント)の表現が
どんなにタコでもその意図を尊重すべきでしょう(おっとっと :-))。

これ以上は掲示板よりも出題者とがりんしゃさんとの間で
解決すべきだと思います。

aval1 = 入力値;
mask = 0x03;
sw = aval1 & (mask);
aval2 = aval1 & (~mask);

switch(sw) {
case なんとか:
    ans = 操作(aval1);  // これかな?
    ans = 操作(aval2);  // これかな?
    ans = 操作(sw);  // これかも?
    break;
// 中略
}




この投稿にコメントする

削除パスワード

No.23786

Re:参考までに
投稿者---まきじ(2005/10/22 13:39:25)


>ANDをとる前の値(入力値)を1/4倍する、という可能性が残っています。

23630 で がんしゃりさんが

>>・マスクした値 4パターンの処理
>>値:0 符号変換(+、−を逆に)
>>値:1 値を5倍にする
>>値:2 値を1/4にする
>>値:その他 値を0にする

仰ってますが?


この投稿にコメントする

削除パスワード

No.23813

Re:参考までに
投稿者---がりんしゃ(2005/10/24 14:26:03)


>ANDをとる前の値(入力値)を1/4倍する、という可能性が残っています。

出題者によるとその通りのようです。
入力した値を、5倍、1/4倍など加工します。

>>・マスクした値 4パターンの処理
>>>値:0 符号変換(+、−を逆に)
>>>値:1 値を5倍にする
>>>値:2 値を1/4にする
>>>値:その他 値を0にする

すいません。私の日本語がわかりにくかったようです。(私のというより、出題文そのままですが・・・。)
「マスクした値 4パターンの処理」
というのは

10101111 ←(ア)入力した値
00000011 ←(イ)マスク処理
--------
00000011 ←(ウ)マスクした値

(ウ)のマスクした値が4パターンとなるようです。
(ウ)の下位2ビットの値によって、(ア)に対する処理を変えるということです。

例えば
10101001
00000011
--------
00000001
ならば、(ウ)は01で値は1なので、(ア)を5倍します。
出題者によると、こういう意図のようです。

出題者に問題の意図がわからないと事を質問すると、「あなたはマスクの意味がわかっていない」ということを言われましたが・・・
出題者の意図するものを作成するのは当然なので作っていますが、正直はっきりと納得はできていません。。



この投稿にコメントする

削除パスワード

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