掲示板利用宣言

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

 私は

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

掲示板2

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

No.26575

ビット演算
投稿者---あきき(2006/04/09 22:56:41)


全く初歩的な質問です。ビット演算を行う時に、例えば下のコーディングのようにビット演算を行う時、変数に16進数で代入するのでしょうか。
&, |, ^, ~の演算の意味が分かっても、変数に16進数でしか代入しない理由が分かりません。なぜなんでしょうか。
#include <stdio.h>

int main(void)
{
    int a = 0x14;
    
    printf("a&0x0f = %x\n", a & 0x0f);
    printf("a|0xf0 = %x\n", a | 0xf0);
    printf("a^0xff = %x\n", a ^ 0xff);

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ビット演算 26576 ぽこ 2006/04/09 23:15:08
<子記事> Re:ビット演算 26578 RiSK 2006/04/10 00:57:42


No.26576

Re:ビット演算
投稿者---ぽこ(2006/04/09 23:15:08)


>&, |, ^, ~の演算の意味が分かっても、変数に16進数でしか代入しない理由が分かりません。なぜなんでしょうか。

どのビットに対する演算か直感的に掴めるからでは?
10進数で書かれると、どのビットに対して操作しているのか
一目じゃ分かりません。



この投稿にコメントする

削除パスワード

No.26578

Re:ビット演算
投稿者---RiSK(2006/04/10 00:57:42)


>全く初歩的な質問です。ビット演算を行う時に、例えば下のコーディングのようにビット演算を行う時、変数に16進数で代入するのでしょうか。

決まりはありません。
8進表記や16進表記ならばビット単位の桁揃えをイメージしやすいからでしょう。

>&, |, ^, ~の演算の意味が分かっても、変数に16進数でしか代入しない理由が分かりません。なぜなんでしょうか。

念のためですけど,

unsigned int a = 3735928559
unsigned int a = 033653337357
unsigned int a = 0xDEADBEEF;

いずれもaには同じ「値」が入ることは理解してますか?
いずれのaだろうとビット演算できますし,
同じ演算をすれば,同じ結果(値)になります。


この投稿にコメントする

削除パスワード

No.26587

Re:ビット演算
投稿者---あきき(2006/04/11 01:26:04)


>変数に16進数で代入するのでしょうか。

>決まりはありません。
>念のためですけど,
>unsigned int a = 3735928559
>unsigned int a = 033653337357
>unsigned int a = 0xDEADBEEF;
>
>いずれもaには同じ「値」が入ることは理解してますか?
>いずれのaだろうとビット演算できますし,
>同じ演算をすれば,同じ結果(値)になります。

16進数・8進数・10進数のいずれを代入しても最終的に、2進数に変換されるような気がします。そう理解してもいいのでしょうか。



この投稿にコメントする

削除パスワード

No.26588

Re:ビット演算
投稿者---RiSK(2006/04/11 01:58:13)


>16進数・8進数・10進数のいずれを代入しても最終的に、2進数に変換されるような気がします。そう理解してもいいのでしょうか。

「進数」って言うから分かりにくいのだろうか…。
あくまで「N進表記」です。

アラビア数字の4という表記はローマ数字のIXとかIIIIと同じですよね。
これら三つの表記は同じ数(値)を表しており,
表記が変わるだけです。

「変換」だって単に表記(人間から見える書き方)を変換しているだけで,
コンピュータの内部表現が変わっているわけではないです。

まぁ,コンピュータの内部ではいつでも2進法を使っているのかもしれませんが,人間(ユーザ)にとって(たいていの場合)どうでもいいことです。
#include<stdio.h>
int main(void){
    printf("%u\n", 3735928559u);
    printf("%u\n", 033653337357u);
    printf("%u\n\n", 0xDEADBEEFu);
    printf("%u\n", 3735928559u);
    printf("0%o\n", 3735928559u);
    printf("0x%X\n", 3735928559u);
}



この投稿にコメントする

削除パスワード

No.26590

Re:ビット演算
投稿者---RiSK(2006/04/11 02:09:29)


ひどい間違いだ。訂正します。

>アラビア数字の4という表記はローマ数字のIXとかIIIIと同じですよね。

アラビア数字の4という表記はローマ数字のIVとかIIIIと同じですよね。


この投稿にコメントする

削除パスワード

No.26589

Re:ビット演算
投稿者---shu(2006/04/11 02:02:37)


>16進数・8進数・10進数のいずれを代入しても最終的に、2進数に変換されるような気がします。そう理解してもいいのでしょうか。

……確認して欲しい。

//
//  サンプルプログラム
//

//
#include <stdio.h>

//
char *str_bin( unsigned int n );

//
//
int main( void )
{
    unsigned int a;
    
    //
    a = 3735928559;
    printf( "%u:\t%s\n", a, str_bin( a ) );
    
    a = 033653337357;
    printf( "%o:\t%s\n", a, str_bin( a ) );
    
    a = 0xDEADBEEF;
    printf( "%x:\t%s\n", a, str_bin( a ) );
    
    return 0;
}


//
char *str_bin( unsigned int n )
{
    static char bin[] = "00000000000000000000000000000000";
    int i;
    
    //
    for (i = 0; bin[i]; i++)
        bin[i] = (n << i & 0x80000000) ? '1' : '0';
    
    return bin;
}



この投稿にコメントする

削除パスワード

No.26591

Re:ビット演算
投稿者---wis(2006/04/11 02:11:34)


>16進数・8進数・10進数のいずれを代入しても最終的に、2進数に変換されるような気がします。そう理解してもいいのでしょうか。

RiSKさんもおっしゃっていますが、
進数を変換するというのは、
表記上変換するだけであって、
値が変換される訳ではない事を理解していますか?
ということです。

数値は何進数であろうと、同じ『値』をとります。
それを8進か10進か16進で見るかの違いだけです。
変換されるのは単に表記上の問題に過ぎません。



この投稿にコメントする

削除パスワード

No.26599

Re:ビット演算
投稿者---あきき(2006/04/11 16:28:16)


>>いずれもaには同じ「値」が入ることは理解してますか?
>>いずれのaだろうとビット演算できますし,
>>同じ演算をすれば,同じ結果(値)になります。
            ↑
16進数・8進数・10進数で代入する違いがあっても、
内部では2進数と認識しているというわけですね。


この投稿にコメントする

削除パスワード

No.26601

Re:ビット演算
投稿者---RiSK(2006/04/11 16:35:26)


>16進数・8進数・10進数で代入する違いがあっても、
>内部では2進数と認識しているというわけですね。

(現在のコンピュータは大抵)2進法で演算しているかもしれませんが,
2進数として演算しているわけではありません。

「N進数」「N進表記」って概念はあくまで人間のための表記法です。
「値」の表記の仕方です。

コンピュータ内部では「値」を2進法を用いて表現しているかもしれません。

「2進法」と「2進数」,「2進表記」は異なります。


この投稿にコメントする

削除パスワード

No.26604

Re:ビット演算
投稿者---あきき(2006/04/11 22:10:29)


>「2進法」と「2進数」,「2進表記」は異なります。

「2進法」と「2進数」は同じものを指すことは分かりましたが、
「2進表記」についての説明ができません。どこが異なるのでしょうか。


この投稿にコメントする

削除パスワード

No.26606

Re:ビット演算
投稿者---RiSK(2006/04/11 23:47:43)


>「2進法」と「2進数」は同じものを指すことは分かりましたが、

えっ? 違うって説明したはずです。

No.26601(ってかスレッド全部)もう一度読んでください。
プログラムも走らせて結果について考察してください。
# 「と」と「,」の優先順位が曖昧だったのは,
# 私の書き方が悪かったかもしれませんが,
# 文脈から読みとることも出来るはずです。

コンピュータ内部では2進法をおそらく使っているとも書いたし,
いったいどこで引っかかっているのでしょうか?


この投稿にコメントする

削除パスワード

No.26607

Re:ビット演算
投稿者---あきき(2006/04/11 23:58:13)


># 「と」と「,」の優先順位が曖昧だったのは,
># 私の書き方が悪かったかもしれませんが,
># 文脈から読みとることも出来るはずです。
>
>コンピュータ内部では2進法をおそらく使っているとも書いたし,
>いったいどこで引っかかっているのでしょうか?

すみません、文章全体をとらえず、一部分で判断してしまいました。
しっかりと書いてあります。

これで解決し、すっきりしました。どうもありがとうございました。


この投稿にコメントする

削除パスワード

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