2017-04-15 24 views
4

我試圖將位添加到__int128(使用clang編譯器和64位系統),但失敗。__int128的位處理

__int128 x = 0;       //DECLARING AND INITIALIZING X 
x |= ((static_cast<__int128>(1)) << 95); //ADDING A '1' TO 95th BIT (from right) 
std::cerr<< std::bitset<100>(x) << std::endl; //PRINTING BITSET 

打印:

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我知道有短形式我可以用無符號的int或長長整型,如
(1U < < 15)或(1LL < < 15) ,但我還沒有找到任何128位等價物。

我需要做什麼使這項工作?

+1

很不錯的缺口;) – Pavel

回答

7

如果我們用括號std::bitset<100>{x},而不是括號std::bitset<100>(x),該計劃失敗,因爲一個收縮轉換的編譯:

error: non-constant-expression cannot be narrowed from type '__int128' to 'unsigned long long' in initializer list [-Wc++11-narrowing]

這裏發生的是__int128工作正常,但轉換到std::bitset不正確。你必須拆分成__int128 64位塊:

std::bitset<100> hi{static_cast<unsigned long long>(x >> 64)}, 
       lo{static_cast<unsigned long long>(x)}, 
       bits{(hi << 64) | lo}; 
std::cout << bits << '\n'; 
+0

的說法是有道理的。 然而,當使用clang進行編譯並使用'std :: bitset <100> {x}時,我得到: 預期'('用於函數樣式轉換或類型構建 –

+2

@GillBates只有在啓用「{x} C++ 11(或更高版本)使用'-std = C++ 11'。 – chtz