C言語の一番大きい整数型ってlong long intだと思うんですが、
できればC言語で64bit以上の(できるだけ大きい)ビットボードを扱いたいんです。
何かいい方法はないでしょうか?
シフト演算ばりばり使いたいんです。
配列にするしかありませんかね。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
GCC限定(Clangもできるみたい)でよければ、独自拡張である__int128
という128bitの整数型が使えます。
GCC Manual 6.8 128-bit Integers
整数型なので算術演算はできるようですが、そのままではリテラルを書く方法やprintfとかで表示する方法がないため、工夫が必要になるようです。
なお、コンパイラが128bit整数を扱えるからと言って、CPUが128bitをそのまま演算できるとは限らないため、コンパイルによりエミュレートしたコードに書き換えられる可能性が大きいです(というか、たぶんできるCPUはまだ存在しない)。少なくとx86_64では遅いようです。参考: messier42の日記: gcc拡張、128bit integer
これよりもっと大きい整数を扱いたい場合は多倍長整数ライブラリ(GMPなど)を使うしかないと思います。他に、PythonやRubyが多倍長整数を実現しているので、そのソースコードを参考にするのも一つかも知れません。
投稿2015/10/22 22:33
総合スコア21751
0
CPUのレジスタ長に限界があるので,64ビットマシンでは64ビットまでしか扱えませんね.
すべてのプログラムは最終的には機械語に翻訳されて実行されますが,
その機械語レベルでは64ビットまでしか扱えないということです.
(アセンブラではmovq,addq,jmpq,callq,retqなどの命令が4バイトと明示した命令です.)
ただし,ハードウェアでは対応していないとしても,ソフトウェアで対応させることは可能です.
通常演算子を持ちいる所を関数呼び出しにすることで,このような問題に対応したプログラムが有ります.
技術計算用Cプログラム ソース(多倍長演算)
他にもライブラリなど存在すると思うので,探してみてください.
多倍長整数でビット演算をする,という物があるのかはわからないので,
無ければ上記コードの桁上げを真似すれば良いと思います.
64ビットごとの移動は配列の移動で,
それ以下のビット数の移動はビットマスクを使って&や<<を駆使して実装することになりそうです.
ただし,ソフトウェアで実現している演算のため,
実行速度はハードウェアでやるものに比べ必然的に遅くなってしまいます.
投稿2015/10/22 21:47
編集2015/10/22 23:54総合スコア751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
C++言語になっちゃいますが、Boostの多倍長整数型を使えばメモリの許す限りいくらでも桁を増やせるそうです。
BoostはC++用の超強力、かつ、マルチプラット・フォームで無償のオープンソースなライブラリです。
商用にも使えるかなり緩やかなライセンスです。
投稿2015/10/23 06:26
総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
https://ipsj.ixsq.nii.ac.jp/ej/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=82197&item_no=1&attribute_id=1&file_no=1&page_id=13&block_id=8
gpuのマルチコアを活かした多倍長演算です。
local to gpu, gpu to local がボトルネックになりそうなので、gpu コアと gpu のメモリ上だけで演算するのがもっとも速度出そうな、、、ー詳細に見てないけど、c/c++でがんばるなら選択肢のひとつかも。
投稿2015/10/23 01:21
総合スコア1693
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
gccであればgnu拡張で__int128
が使えるかもしれません。
__int128 - Using the GNU Compiler Collection (GCC)
ビット演算、足し算、引き算なら64bit型2~3回分程度のコストでできるでしょう。
投稿2015/10/22 22:52
総合スコア1151
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。