Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当整数二进制表示的位数大于给定值时,才移动整数的位_C# - Fatal编程技术网

C# 仅当整数二进制表示的位数大于给定值时,才移动整数的位

C# 仅当整数二进制表示的位数大于给定值时,才移动整数的位,c#,C#,只有当位数大于某个数字时,我才需要将整数的位数右移。以10为例 如果整数是818,那么整数的二进制表示形式是1100110010,在这种情况下,我什么也不做。 如果整数为1842,则整数的二进制表示形式为11100110010,大于10乘以1,因此我需要向右移动一位(或者将索引10处的位设置为0,据我所知,这会给出相同的结果,可能我错了)。 到目前为止,我所做的是使一个由1和0组成的整数数组表示int,但我确信有更优雅的方法来实现这一点 int y = 818; string s

只有当位数大于某个数字时,我才需要将整数的位数右移。以10为例

如果整数是818,那么整数的二进制表示形式是
1100110010
,在这种情况下,我什么也不做。 如果整数为1842,则整数的二进制表示形式为
11100110010
,大于10乘以1,因此我需要向右移动一位(或者将索引10处的位设置为0,据我所知,这会给出相同的结果,可能我错了)。 到目前为止,我所做的是使一个由1和0组成的整数数组表示int,但我确信有更优雅的方法来实现这一点

    int y = 818;
    string s = Convert.ToString(y, 2);
    int[] bits = s.PadLeft(8, '0') 
             .Select(c => int.Parse(c.ToString())) 
             .ToArray();
    if (bits.Length > 10)
    {
        for (int i = 10; i < bits.Length; i++)
        {
            bits[i] = 0;
        }
}
inty=818;
字符串s=Convert.ToString(y,2);
int[]位=s.PadLeft(8,'0')
.Select(c=>int.Parse(c.ToString()))
.ToArray();
如果(位长度>10)
{
for(int i=10;i
我也试着这样做:

if(bits.Length>10){y=y>>(bits.Length-10)}


但由于某种原因,当输入为1891时,我得到了945(
1110110001

不需要对字符串执行此操作。2到10的幂有11个二进制数字,所以

if (y >= Math.Pow(2, 10))
{
    y = y >> 1;
}

似乎可以执行您想要的操作。

位为10=0的AND数字:number=number&0xFFFFFDFF@ATT:您似乎正在清除所有高位,而不是进行任何移位。你确定你不想要简单的(
y&=0x3FF
)吗?如果(y>=(1)不需要每次重新计算-
如果(y>=1024)
就足够了。@ThomasSchremser:编译器应该计算
(1@BenVoigt)你是正确的;我更多的是指
数学.Pow(2,10)
part.很抱歉没有更清楚地表达这一点。我不知道为什么我被否决了。我同意可以简化它,但提问者明确表示10不是一个固定的数字,所以我展示了一种在当时计算条件的方法。@YellowAfterlife的建议是一种改进。