質問編集履歴
1
追記
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 =
|
10
|
+
DWORD d = 4294967295;
|
11
|
-
DWORD
|
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
|
-
|
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
|
-
入力
|
30
|
+
入力値:0の目標結果。
|
20
31
|
<入力>
|
21
|
-
d =
|
32
|
+
d = 11111111111111111111111111111111(4294967295)
|
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
|
-
|
47
|
+
list[0] = 11111111111111111000000000000000(4294934528)
|
48
|
+
list[1] = 00000000000000000111111111111111(32767)
|