teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

追記

2020/01/24 08:34

投稿

JanTh1989
JanTh1989

スコア87

title CHANGED
File without changes
body CHANGED
@@ -1,24 +1,48 @@
1
- 変数の持っている値を、指定ビット以降上書きしたいす。
1
+ 変数の持っている値を、指定ビット以降を開始ビットとして上書きし、データ型上の残っビットはもう一つ変数を用意して、先頭ビットから上書きする、とった動作を行おうとしています。
2
- 組み思ってたものになったのですが、本当にでよいのか、と悩んでおります。
2
+ ひとまずんで結果想定通りになのですが、ビット演算の使い方が、ういうものでよいのか、と悩んでしまっております。
3
3
 
4
- 以下のように作ってみたのですが、ビットシフト行ったり来たりこういうもののかがなんとも言えませんした
4
+ 以下のように作ってみたのですが、「DWORD d2」で使っているシフト演算は、行ったり来たりになっており、なんとも言えないところ
5
5
  もっとスマートな方法があれば、ご教授願いたく思います。
6
6
 
7
- ```ここに言語を入力
7
+ ```C++
8
8
  int _tmain(int argc, _TCHAR* argv[])
9
9
  {
10
- DWORD d = 65535;
10
+ DWORD d = 4294967295;
11
- DWORD d2 = 0;
11
+ DWORD bitSize = 32;
12
12
  WORD target = 0;
13
13
  cin >> target;
14
+ WORD blockCount = 1;
15
+ if (target > 0)
16
+ blockCount++;
17
+ std::vector<DWORD> list;
18
+ for (int i = 0; i < blockCount; i++)
19
+ {
14
- d2 = (d >> target) << target;
20
+ DWORD d2 = (d >> target) << target;
21
+ list.push_back(d2);
22
+
23
+ d = d >> (bitSize - target);
24
+ target = 0;
25
+ }
15
26
  return 0;
16
27
  }
17
28
  ```
18
29
 
19
- 入力4だと以下ような結果。
30
+ 入力値:0目標結果。
20
31
  <入力>
21
- d = 111111111111111165535
32
+ d = 111111111111111111111111111111114294967295
22
- target = 4
23
33
  <結果>
34
+ list[0] = 11111111111111111111111111111111(4294967295)
35
+
36
+ 入力値:1の目標結果。
37
+ <入力>
38
+ d = 11111111111111111111111111111111(4294967295)
39
+ <結果>
40
+ list[0] = 11111111111111111111111111111110(4294967294)
41
+ list[1] = 00000000000000000000000000000001(1)
42
+
43
+ 入力値:15の目標結果。
44
+ <入力>
45
+ d = 11111111111111111111111111111110(4294967294)
46
+ <結果>
24
- d2 = 111111111111000065520
47
+ list[0] = 111111111111111110000000000000004294934528
48
+ list[1] = 00000000000000000111111111111111(32767)