質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

[c言語]変数の進数について

解決済

回答 7

投稿

  • 評価
  • クリップ 0
  • VIEW 1,230

score 11

前提・実現したいこと

レジスタ値を入力した変数を"&"でマスクしたいのですが
正しくマスクできません。

該当のソースコード

BYTE test;
test = 15434642 & 3; //15434642は別の配列から取得した値です。


上記にて期待しているのはbit0,bit1をマスクすることで
test == 2 となることです。
ですが実際はtest == 0 となってしまいます。

試したこと

①以下の場合は期待した値になりました。
test = 0x15434642 & 3;

②以下の場合は期待した値になりませんでした。
test = 15434642 & 0x3;

補足情報(言語/FW/ツール等のバージョンなど)

上記の15434642は決め打ちではなく、レジスタの値を取得してきたものです。
そのため、できればこの値に手を加える以外での解決策をご教示お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • masaya_ohashi

    2016/06/16 17:42

    公開できる範囲で、前後のコードも追記してみていただけますか?どうもこの範囲だけの問題ではないようです。

    キャンセル

  • PineMatsu

    2016/06/16 17:51

    「レジスタの値」というのが気になるのですが、実行環境もできれば教えて下さい。Windowsなのか違うのか。

    キャンセル

回答 7

+1

10進数の15434642を16進数に変換すると0xEB8392になります。
0x3も単なる3も同じ値です。
なので、①②共にAND演算の結果は2になります。
②の結果が2にならないのはおかしい。
Cコンパイラは何を使用してますか?
また、できればチェックしたプログラムを示してもらえますか?

追記:
レジスタ値とありますが、CPUは何でしょうか?ARMやSHなどの組み込みのCPUでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

皆様、大変申し訳ありません。
表示していた値が15434642ではなく15434612でした。
また、10進数表記でした。
そのため、16進数では下位がCとなり0xC & 0x3 == 0x0 になるため
試した①の結果になったのだと思います。
ご迷惑をおかけしました。
皆様にベストアンサーをつけたいのですが、、、最初に回答頂き
追記も細かくして頂けた方につけさせて頂きます。
質問者への評価下げなどの機能がもしあれば容赦なくつけてください。戒めます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/16 18:31

    15434612 は 0xEB8374 なので下位4bitは 0xC ではなく 0x4 です。
    どっちにしても & 0x3 は 0 ですけども。

    キャンセル

  • 2016/06/16 18:39

    数値が間違えていたということですか・・・・。

    キャンセル

checkベストアンサー

0

数値のリテラルで頭に0xがついた数字は16進数のことです。ついていないものは10進数です。
0x15434642 == 356730434です。
そして、
0x3 == 3です。

15434642 & 3をビットで表現すると、
00000000111010111000001110010010 ← 15434642
00000000000000000000000000000011 ← 3
この2つの論理積は
00000000000000000000000000000010 ← 2

0x15434642 & 0x3をビットで表現すると
00010101010000110100011001000010 ← 0x15434642
00000000000000000000000000000011 ← 0x3
この2つの論理積は
00000000000000000000000000000010 ← 2

あれ…?どっちにしろ2が正しいですね。0になるのはどこか違う部分が間違っているように見えます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/16 17:34

    回答ありがとうございます。
    つまり上記コードでは10進数で比較していたということですね。

    キャンセル

0

test = 0x15434642 & 3;
test = 15434642 & 0x3; //15434642 == 0xEB8392

どちらもtest == 2になります。

BYTEが実際には何型なのか、コンパイラは何を使っているのか、「期待した値」はどうやってチェックしたのか、など書いて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

15434642は10進数でしょうか、16進数でしょうか。
まずはそこを明確にする必要があります。
16進数であるなら頭に0xをつけないといけません。
3の方は、10進数でも16進数でも同じ値なのであまり気にする必要はないですが、個人的にはビット演算になるので16進数で表しておきたいです。
試しに10進数と16進数の組み合わせを確認してみましたが、全て結果は2になりました。

char test;
test = 15434642 & 3;
printf( "%d\n", test);
test = 0x15434642 & 3;
printf( "%d\n", test);
test = 15434642 & 0x3;
printf( "%d\n", test);
test = 0x15434642 & 0x3;
printf( "%d\n", test);


結果

2
2
2
2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

型から察するにWindows上でのCのBYTE型かと思います。

今手元にWindowsがないので試せませんが、
BYTEはunsigned charなので、次のコードではどうなりますか?

BYTE test;
test = (15434642 & 0xff) & 3; //15434642は別の配列から取得した値です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ideone
2 になりますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る