Javaには、生成された番号を生成するrotatetoleftと呼ばれる関数があります
int n;
n = Integer.rotateLeft(1, 5);
System.out.print(n);
出力; 32
c# でこれに似ているものは何ですか?
<<
演算子の直後にいるように聞こえますが、それは左シフトのみを実行します。LSB に回転しません。そのためには、シフトと OR を組み合わせて行う必要があります。例えば:
static int RotateLeft(int value, int shift)
{
return (value << shift) | (value >> (32 - shift));
}
value
右シフトの符号拡張のために最上位ビットが設定されている場合、これは適切に機能しないことに注意してください。で算術演算を行うことで修正できますuint
。
static int RotateLeft(int value, int shift)
{
unchecked
{
uint uvalue = (uint) value;
uint uresult = (uvalue << shift) | (uvalue >> 32 - shift);
return (int) uresult;
}
}
私はC#にそのようなものがあるとは思わない.私はここで同様の質問を見つけた.答えはこの実装を示唆している:(C言語)
unsigned int _rotl(const unsigned int value, int shift)
{
if ((shift &= sizeof(value) * 8 - 1) == 0)
return value;
return (value << shift) | (value >> (sizeof(value)*8 - shift));
}
unsigned int _rotr(const unsigned int value, int shift)
{
if ((shift &= sizeof(value) * 8 - 1) == 0)
return value;
return (value >> shift) | (value << (sizeof(value)*8 - shift));
}