我正在使用64位的Mac OS X,我有一個NSUInteger(或uint64,這對我的系統沒有任何影響)。如何從64位整數中獲得更高的20位?
如何獲得更高的20位NSUInteger並將其存儲在另一個NSUInteger中?
你可以回答在C,C++或Objective-C中如何做到這一點。
P.S.請不要告訴我修改所有代碼並改用位域。
P.P.S.我想我必須使用位掩碼和移位?
我正在使用64位的Mac OS X,我有一個NSUInteger(或uint64,這對我的系統沒有任何影響)。如何從64位整數中獲得更高的20位?
如何獲得更高的20位NSUInteger並將其存儲在另一個NSUInteger中?
你可以回答在C,C++或Objective-C中如何做到這一點。
P.S.請不要告訴我修改所有代碼並改用位域。
P.P.S.我想我必須使用位掩碼和移位?
對於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 |
+---+---+---+---+---+---+---+---+
+1 - 漂亮的ASCII藝術品,顯示位操作是圖片形式。 –
我是不與第一換檔爲符號數意識到一個問題。這是一個實現相關的功能嗎?它似乎沒有,如果你之前或之後轉變爲我實現符號或無符號要重要得多:
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
不要你只是想'我>> 44' ?或者如果NSUInteger可以大於64,那麼'(i >> 44)&0xFFFFF'。 – ikegami
是的,當然。謝謝。 –