質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

309閲覧

unsigned long long内のビット列の一部を取得・表示させたい

RyuSA

総合スコア131

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/17 11:58

編集2017/08/17 12:30

###前提・実現したいこと

C++で、メモリ省エネのためにunsigned long long(64bit)に6bitデータを10個埋め込む、という稀有なことをやろうとしています。

この場合、デバッグ用にunsigned long longの要素を確認する方法としてどのようなやり方がありますか?
どなたか、知恵をいただけないでしょうか?

どのような情報が必要かがわからないので、情報不足であれば教えてください。
すぐに追加記入します。

###該当のソースコード

cpp

1// 2変数で0000 000001 000001 000001 ... 000001 (000001が10回)を示す 2unsigned long long a = 0x41041041041041ULL; 3// a = 18300341342965825 4cout << "a = "<< a << endl; 5 6// OriginalPrint(a)として, aから1を10回を取り出せるようなOriginalPrintが欲しい 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/08/17 12:43 編集

組み込みでもされるのでしょうか?8bitの領域を10要素配列として管理しても、16bitしか差異が出ませんが、そこまでリソースを節約する必要が本当にあるのでしょうか?
RyuSA

2017/08/17 12:48

はい、細かいことは省きますが必要なのです。それとSIMD演算を適応したいのでこんな稀有な形式にしてます。もしももっと良いやり方があるのなら手のひらクルリと変えますが……
guest

回答2

0

BA出てますがbitsetを利用する例です。文字列操作を含むため速度は遅いと思います。参考まで。
参考:[C++]BYTE配列のビット操作

C++

1#include <iostream> 2#include <bitset> 3using namespace std; 4 5const int W = 6; 6const int N = 10; 7const int BIT = W * N; 8 9void OriginalPrint( unsigned long long a) 10{ 11 cout << "a=" << a << endl; 12 bitset<BIT> ba(a); 13 auto s = ba.to_string(); 14 for( int i = 0; i < N; i++){ 15 auto s6 = s.substr( i*W,W); // 00000001 16 bitset<W> b6(s6); 17 cout << b6 << "("; // 00000001 18 cout << b6.to_ulong() << "),"; // 1 19 } 20 cout << endl; 21} 22 23int main() { 24 OriginalPrint(0x41041041041041ULL); 25 OriginalPrint(0x289207185103081ULL); 26 return 0; 27}
a=18300341342965825 000001(1),000001(1),000001(1),000001(1),000001(1),000001(1),000001(1),000001(1),000001(1),000001(1), a=182712931821039745 001010(10),001001(9),001000(8),000111(7),000110(6),000101(5),000100(4),000011(3),000010(2),000001(1),

投稿2017/08/17 13:10

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C++

1#include <iostream> 2#include <string> 3#include <sstream> 4 5std::string OriginalPrint(unsigned long long x) 6{ 7 std::ostringstream oss; 8 oss << "{"; 9 for (int n = 9; 0 <= n; n--) { 10 unsigned long long value = (x >> (n * 6)) & 0b111111ULL; 11 oss << value << (n ? "," : "}"); 12 } 13 return oss.str(); 14} 15 16int main() 17{ 18 unsigned long long a = 0x41041041041041ULL; 19 std::cout << OriginalPrint(a) << std::endl; 20 // {1,1,1,1,1,1,1,1,1,1} 21 22 std::cout << OriginalPrint(0x289207185103081ULL) << std::endl; 23 // {10,9,8,7,6,5,4,3,2,1} 24}

投稿2017/08/17 12:49

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問