2014-01-20 55 views
1

我正在使用64位的Mac OS X,我有一個NSUInteger(或uint64,這對我的系統沒有任何影響)。如何從64位整數中獲得更高的20位?

如何獲得更高的20位NSUInteger並將其存儲在另一個NSUInteger中?

你可以回答在C,C++或Objective-C中如何做到這一點。

P.S.請不要告訴我修改所有代碼並改用位域。

P.P.S.我想我必須使用位掩碼和移位?

+10

不要你只是想'我>> 44' ?或者如果NSUInteger可以大於64,那麼'(i >> 44)&0xFFFFF'。 – ikegami

+0

是的,當然。謝謝。 –

回答

3

對於uint64_t中,你可以簡單地使用

i >> 44 

對於符號類型或類型,可能是大於64位,你還需要屏蔽掉的高位。

(i >> 44) & 0xFFFFF 

甲較小規模的例子,

4 bits starting at pos 2 of 8. 

    7 6 5 4 3 2 1 0 
+---+---+---+---+---+---+---+---+ 
| ? | ? |  j  | ? | ? | 
+---+---+---+---+---+---+---+---+ 

          >> 2 

+---+---+---+---+---+---+---+---+ 
| * | * | ? | ? |  j  | * = 0 if unsigned or original bit7 if signed. 
+---+---+---+---+---+---+---+---+ 

        & (2**4 - 1) 

+---+---+---+---+---+---+---+---+ 
| 0 | 0 | 0 | 0 |  j  | 
+---+---+---+---+---+---+---+---+ 
+0

+1 - 漂亮的ASCII藝術品,顯示位操作是圖片形式。 –

0
uint64 original = ...; 
uint64 another = ((0xFFFFF00000000000 & original) >> 44); 

先用位掩碼然後向右移動44位。

+0

如果你先轉換然後掩蓋它,那麼你不太可能在輸入常量時出錯。 – Ferruccio

+0

首先掩蔽也將失敗的簽名類型。 – ikegami

0

我是不與第一換檔爲符號數意識到一個問題。這是一個實現相關的功能嗎?它似乎沒有,如果你之前或之後轉變爲我實現符號或無符號要重要得多:

int main() 
{ 
    uint64_t a = std::numeric_limits<uint64_t>::max(); 
    int64_t b = std::numeric_limits<int64_t>::max(); 
    uint64_t c = std::numeric_limits<uint64_t>::max(); 
    int64_t d = std::numeric_limits<int64_t>::max(); 

    a = (0xFFFFF00000000000 & a) >> 44; 
    b = (0xFFFFF00000000000 & b) >> 44; 
    c = 0xFFFFF & (c >> 44); 
    d = 0xFFFFF & (d >> 44); 
    cout << "a = " << a << "; c = " << c << "; a?=c = " << (a==c) << endl; 
    cout << "b = " << b << "; d = " << b << "; b?=d = " << (b==d) << endl; 

    return 0; 
} 

這將產生:

a = 1048575; c = 1048575; a?=c = 1 
b = 524287; d = 524287; b?=d = 1 

$ c++ --version 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin12.5.0 
Thread model: posix 
相關問題