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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

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

Q&A

解決済

3回答

1256閲覧

指定ビット以降のデータに上書き

JanTh1989

総合スコア87

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

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

0グッド

0クリップ

投稿2020/01/23 09:45

編集2020/01/24 08:34

変数の持っている値を、指定ビット以降を開始ビットとして上書きし、データ型上の残ったビットはもう一つ変数を用意して、先頭ビットから上書きする、といった動作を行おうとしています。
ひとまず組んでみて、結果は想定通りになるのですが、ビット演算の使い方が、こういうものでよいのか、と悩んでしまっております。

以下のように作ってみたのですが、「DWORD d2」で使っているシフト演算は、行ったり来たりになっており、なんとも言えないところです。
もっとスマートな方法があれば、ご教授願いたく思います。

C++

1int _tmain(int argc, _TCHAR* argv[]) 2{ 3 DWORD d = 4294967295; 4 DWORD bitSize = 32; 5 WORD target = 0; 6 cin >> target; 7 WORD blockCount = 1; 8 if (target > 0) 9 blockCount++; 10 std::vector<DWORD> list; 11 for (int i = 0; i < blockCount; i++) 12 { 13 DWORD d2 = (d >> target) << target; 14 list.push_back(d2); 15 16 d = d >> (bitSize - target); 17 target = 0; 18 } 19 return 0; 20}

入力値:0の目標結果。
<入力>
d = 11111111111111111111111111111111(4294967295)
<結果>
list[0] = 11111111111111111111111111111111(4294967295)

入力値:1の目標結果。
<入力>
d = 11111111111111111111111111111111(4294967295)
<結果>
list[0] = 11111111111111111111111111111110(4294967294)
list[1] = 00000000000000000000000000000001(1)

入力値:15の目標結果。
<入力>
d = 11111111111111111111111111111110(4294967294)
<結果>
list[0] = 11111111111111111000000000000000(4294934528)
list[1] = 00000000000000000111111111111111(32767)

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

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

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

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

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

y_waiwai

2020/01/23 10:02

どういう入力でどういう結果がほしいんでしょうか。 何通りかの例を提示しましょう
dodox86

2020/01/23 10:25

> (d >> target) << target 確かに、何をされたいのか判然としませんね。target分のビットを(結果的に)0クリアしているだけに見えます。
cateye

2020/01/23 12:23

“データに上書き”ではなく“クリア”なのでは?
JanTh1989

2020/01/24 08:34

質問内容、サンプルコードなどを修正しました。
guest

回答3

0

std::bitsetでやってみた。

C++

1#include <iostream> 2#include <bitset> 3 4int main() { 5 using namespace std; 6 7 bitset<32> d = ~bitset<32>(); 8 int target = 4; 9 bitset<32> d2 = d & (~bitset<32>() << target); 10 cout << d2.to_ulong() << ' ' << d2.to_string(); 11}

投稿2020/01/23 12:16

episteme

総合スコア16614

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

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

JanTh1989

2020/01/24 08:34

ご回答ありがとうございます。 bitsetというものもあるのですね。 知識不足でした。
guest

0

こういう方法も有る・・・という事で

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int t=65535; 6 int a= ~0; // ←-1(0xFFFFFFFF) 7 int b= 3; 8 9 t &= a << b; 10 printf("%x\n",t); 11 12 return 0; 13} 14

結果
usr ~/Project/test % ./a.out
fff8

投稿2020/01/23 10:58

cateye

総合スコア6851

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

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

0

ベストアンサー

なにをしようとしてるかよーわからんですが、

d2 = d & (0xffffffff << target);

こういうことかな?

投稿2020/01/23 10:49

y_waiwai

総合スコア87784

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

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

JanTh1989

2020/01/24 08:38

回答ありがとうございます。 質問が中途半端で分かりづらくなってしまっていたなか、的確な回答ありがとうございます。 元値をシフトして編集するのではなく、マスク値をビットシフトで作ってしまう、というやり方なのですね。 発想乏しく、方法が浮かびませんでした。 この方法で進めようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問