2012-05-03 6 views
0

長いNビットから切り取ってintを取得し、それを取り出す方法(および読み込み可能なintを取得する方法) 私は長いNビットから切り取ってintとcoutを得る方法(および読み込み可能なintを得る方法)

int count = sizeof(long) - sizeof(int); 
    int int_val =(long_val>> (sizeof(long) - count)); 

を試してみてくださいしかし、いくつかのhorible COUTを取得...私は何をしなければなら - int型を取得し、それをCOUT(と読めるint型を取得)するために、長いNビットからカットする方法?下位Nビットを取得するために

+1

'long'が' int'よりも長いと仮定すると(whi chは悪い仮定です。彼らはしばしば同じ長さです)、あなたは好きなビット:高いものか低いものか? –

+0

シフト量は 'sizeof(l) - (sizeof(l) - sizeof(i))'です。 'long'が64ビットで' int'が32ビットなら '32'です; 'long'と' int'が両方とも32ビットであれば、結果は '32 'です。しかし、後者の場合、それは間違っていると感じます... – sarnold

+0

[ここで解決しようとしている根本的な問題は何ですか?](http://meta.stackexchange.com/questions/66377/what-is-the-xy-問題) – Johnsyweb

答えて

0

、元のコードには二つの問題があります(long_val & ((1<<(N-1)) - 1))

0

を試してみてください。

  1. sizeofオペレータがバイトの単位で動作しますが、>>オペレータがで動作しますビットの単位。

  2. あなたはsizeof(long) - sizeof(long) + sizeof(int)でシフトしていますが、これは偶然によってのみ正しいことがあります。

あなたは移植性のある形で下位バイトを取得したい場合は、あなたが使用することができます。

unsigned int_val = (unsigned) (long_val & UINT_MAX); 
1

は(最適化されていない)次のことを試してみてください。

#include <limits> 
#include <iostream> 

using namespace std; 

int lowerBits(long in) { 
    // use unsigned so that sign bit is not propagated 
    // when compiler casts it to a long 
    return in & (unsigned) -1; 
} 

int upperBits(long in) { 
    return lowerBits(in >> numeric_limits<unsigned int>::digits); 
} 

int main(int, char **) { 
    cout << hex << lowerBits(0x4321432112341234) << endl; 
    cout << hex << upperBits(0x4321432112341234) << endl; 
} 

出力に64ビットマシン、gccを使用して:

12341234 
43214321