2016-03-19 8 views
-2

Cでメモリマネージャを作成していて、それが正しく整列されていることを確認しようとしています(ユーザ空間が8で割り切れるアドレスから開始するようにしてください。 8も同様)。ビット演算子または演算子|メモリブロックを整列するためのCの使用

誰もこれが何を私に言うことができる場合、私は思っていた

x = ((x - 1) | 7) + 1; 

それは友人が私に示唆されたコードの一部ですが、私はそれが/何垂直バーのをやって何がわかりませんよ関数はこのシナリオにあります

編集: 私はこれを少しはっきりと説明できたことが分かりました。 xはintであり、ビット単位のOR演算子であることを調べましたが、この文脈で意味することを理解できませんでした。助けてくれてありがとう!

+3

Stackoverflowは、基本的な言語を学習するのに最適な場所ではありません。基本的なCチュートリアルや本を参照してください。特にあなたのクエストについては、 '|'は[bitiwise OR演算子](https://en.wikipedia.org/wiki/Bitwise_operations_in_C)です。 – kaylum

+0

あなたはなぜあなたの友人に質問しませんでしたか? –

+1

これは間違っています。少なくとも 'int'値を使うのは悪い考えです。 – Olaf

答えて

2

8で割り切れる数を作るための標準的な方法は次のとおりです。あなたの友人の構造よりも理解しやすくなる(ちなみにおそらく同様に動作しますが、以下を参照)する必要があり

len = (len + 7) & 0xfffffff8; /* for positive 32-bit values */ 

あなたが持っている構造体は、ビット単位でビット単位で論理和を取って7のビットを設定します(したがって、8で割ったときに余りが7になるようにします)。 -1はあなた自身で解決しなければならないことを意味します。一見するとそれが何をしているのか見ていないと、私はそれを見たり、それを使用したりしません。

アドレスとブロック長として符号付き整数を使用することをお勧めしますかどうかは、必ず他のコメントを取得します。

0

この文はそうのように、if文である:

if (x % 8 != 0): 
    x = ((x - 1) | 7) + 1; 

私はちょうど、最初はそのための謝罪をコードフラグメントでより多くのを含めましたする必要があります。一度私のバイナリの数学を見直したら、 "| 7"はORと0111を意味し、これはxがミスアライメントされていると考えられるときの文であることを考えると、次のようになります。

if(x-1)< 7:((x-1)| 7)は0111です.1を加えると8が得られ、これは条件を満たすものです。

15>(X-1)> 7場合:((X-1)| 7)であり、1111は1を追加するには、再度ようにより高い値について

とを満たし、16を与えます。

皆様のご意見ありがとうございます。これが私の最初の質問だったので、今後も改善していきます!