引数として受け取ったビットを左に回転した上で、結果を返すオーバーロード関数rotate()を作成しなさい。整数と長整数を受け取るように、この関数をオーバーロードしなさい。
【監修者注:現在のほとんどすべてのコンパイラでは、整数と長整数を区別して実装されていません。したがってこの問題には、どちらも同じように解答するべきです。】
という問題があり、ビットを回転する処理の仕方が分からなかったので解答(以下)
コード:
#include <iostream>
using namespace std;
int rotate(int i);
long rotate(long i);
int main()
{
int a;
long b;
a = 0x8000;
b = 8;
cout << rotate(a);
cout << "\n";
cout << rotate(b);
return 0;
}
int rotate(int i)
{
int x;
if (i & 0x80000000) x = 1;
else x = 0;
i = i << 1;
i += x;
return i;
}
long rotate(long i)
{
int x;
if (i & 0x80000000) x = 1;
else x = 0;
i = i << 1;
i += x;
return i;
}
を確認し、私の環境windows10 Pro 64bit , Visual Studio Community 2017 において
65536
16
という結果が得られました。
int aの例では値 16進数 0x8000 は、2進数では 0000 0000 0000 0000 1000 0000 0000 0000 なので、
1が左へ1ビット移動し、32ビット目の? 0が一番右に入れられた結果、
0000 0000 0000 0001 0000 0000 0000 0000 になり、10進数表記で65536 と出力された。…ということのようです。(sizeof演算子で調べたらint型もlong型もともに4バイトでした。)
rotate()関数の宣言内
コード:
{
int x;
if (i & 0x80000000) x = 1;
else x = 0;
i = i << 1;
i += x;
return i;
}
が、具体的にはどういう処理なのかが掴めないで困っております。
どの部分はどういう意味という風に教えていただけないでしょうか。
特にifの行がよく分かりません。
引数として受け取ったビットを左に回転した上で、結果を返すオーバーロード関数rotate()を作成しなさい。整数と長整数を受け取るように、この関数をオーバーロードしなさい。[size=85]【監修者注:現在のほとんどすべてのコンパイラでは、整数と長整数を区別して実装されていません。したがってこの問題には、どちらも同じように解答するべきです。】[/size]
という問題があり、ビットを回転する処理の仕方が分からなかったので解答(以下)
[code]
#include <iostream>
using namespace std;
int rotate(int i);
long rotate(long i);
int main()
{
int a;
long b;
a = 0x8000;
b = 8;
cout << rotate(a);
cout << "\n";
cout << rotate(b);
return 0;
}
int rotate(int i)
{
int x;
if (i & 0x80000000) x = 1;
else x = 0;
i = i << 1;
i += x;
return i;
}
long rotate(long i)
{
int x;
if (i & 0x80000000) x = 1;
else x = 0;
i = i << 1;
i += x;
return i;
}
[/code]
を確認し、私の環境windows10 Pro 64bit , Visual Studio Community 2017 において
65536
16
という結果が得られました。
int aの例では値 16進数 0x8000 は、2進数では 0000 0000 0000 0000 1000 0000 0000 0000 なので、
1が左へ1ビット移動し、32ビット目の? 0が一番右に入れられた結果、
0000 0000 0000 0001 0000 0000 0000 0000 になり、10進数表記で65536 と出力された。…ということのようです。(sizeof演算子で調べたらint型もlong型もともに4バイトでした。)
rotate()関数の宣言内
[code]
{
int x;
if (i & 0x80000000) x = 1;
else x = 0;
i = i << 1;
i += x;
return i;
}
[/code]
が、具体的にはどういう処理なのかが掴めないで困っております。
どの部分はどういう意味という風に教えていただけないでしょうか。
特にifの行がよく分かりません。