C# 查找随机比特组合

C# 查找随机比特组合,c#,reverse,bit-shift,C#,Reverse,Bit Shift,我有个问题。 我试图找到右班操作的组合。 举个例子。 我有一个意见: 比如说30。 我现在找到a和b,这样a>>b=mynumber(30) 这是我的尝试: private static Random rnd = new Random(); private static int[] FindRightShift(int value) { int[] arr = new int[2]; for (int i = 1;

我有个问题。 我试图找到右班操作的组合。 举个例子。 我有一个意见:

比如说30。 我现在找到a和b,这样a>>b=mynumber(30)

这是我的尝试:

private static Random rnd = new Random();
        private static int[] FindRightShift(int value)
        {
            int[] arr = new int[2];
            for (int i = 1; i < int.MaxValue; i++)
            {
                int b;
                if (int.TryParse((Math.Log(i / value) / Math.Log(2)).ToString(), out b))
                {
                    arr[0] = i;
                    arr[1] = b;
                    Console.WriteLine("{0} >> {1} = {2}", arr[0], arr[1], arr[0] >> arr[1]);
                    // return arr;
                }
            }
            return arr;
        }
private static Random rnd=new Random();
私有静态int[]FindRightShift(int值)
{
int[]arr=新的int[2];
对于(int i=1;i{1}={2}”,arr[0],arr[1],arr[0]>>arr[1]);
//返回arr;
}
}
返回arr;
}
这是可行的,但它需要时间,因为它是循环槽所有的组合。
我如何修改我的函数,使其返回一个随机组合(a和b),而不遍历所有函数?

我昨天向您发送了我的更新版本,据我测试,所有函数都运行良好。 欢迎任何更正

主要概念是关于右移到底是什么的数学: x/2^y=number(其中^表示功率)

intmaxpower=(int)Math.Log(int.MaxValue,2);//30->最大功率不超过int.MaxValue
maxPower=(int)Math.Log(Math.Pow(2,maxPower)/number,2);//防止“NOTE1”>int.MaxValue
for(int y=0;y{1}={2}”,x,y,x>>y);
}

当前设置的主要问题是,它没有检查移位是否导致位“关闭”。 以字节为例,数字12为: 000011100

这意味着可以向左移动的最大字节数是4。反之亦然,使用示例语法
y
,最大值也可以是4(和
x
最大值192) 对于int和其他有符号变量,还有一个附加行为,即当移位负值时,第一个(符号)位的处理方式不同(见最后一段)。 移动正数1073741824(1 1);否则检查=()=>nr<(1>y,最大移动); } 另一种方法是继续尝试一个新的随机变量,直到反向移位为真。重用当前代码:

    int x, y;
    do
    {
        y = R.Next(1, 30); // random valid power       
        x = number << y;
    } while (x >> y != number);
    Console.WriteLine("{0} >> {1} = {2}", x, y, x >> y);
intx,y;
做
{
y=R.Next(1,30);//随机有效幂
x=数量>y!=数量);
WriteLine(“{0}>{1}={2}”,x,y,x>>y);

Um,
a=mynumber,b=0
?我指的是一个随机组合,其中a和b两个数字都不为0。请选择一个随机数,并将该数字左移那么多位……a=mynumber@usr a=mynumber
private static void FindRightShift(int number)
{
    int maxshifts = 0, nr = number;
    Func<bool> check;
    if (number < 0) check = () => nr > (int.MinValue >> 1); else check = () => nr <  (1 << 30);
    while (check())
    {
        nr <<= 1;
        maxshifts++; //you could also opt to do a random break here
    }
    if (maxshifts ==0)
        throw new ArgumentException("Invalid number");
    int y = R.Next(1, maxshifts), x = number << y;
    //Debug.Assert((x >> y) == number);
    Console.WriteLine("{0} >> {1} = {2} (maxshifts: {3})", x, y, x >> y,  maxshifts);
}
    int x, y;
    do
    {
        y = R.Next(1, 30); // random valid power       
        x = number << y;
    } while (x >> y != number);
    Console.WriteLine("{0} >> {1} = {2}", x, y, x >> y);