int到二进制函数没有递归?

时间:2012-01-21 15:17:27

标签: c# bit-manipulation

我想将十进制数显示为位。

int g = 2323;

for (int i = 31; i>=0; i--) // int has 32 bits
{
    Console.Write(((g >> 1) & 1) == 1 ? "1" : "0"); // shift right 1 and display it
    g = g / 2; // shift right= divide by 2
}

然而,这显示像镜子(12345 - > 54321)

的数字

我可以向左移动但是然后:我可能会异常......(数字太大)

我需要在代码中更改以显示正确的内容,但是:

  1. 没有转换(...)方法
  2. 没有插入中间人阵列
  3. 没有递归。
  4. 有什么事吗?

5 个答案:

答案 0 :(得分:4)

刚刚出头:

int g = 2323;

for (uint mask = 0x80000000; mask != 0; mask >>= 1)
    Console.Write(((uint)g & mask) != 0 ? "1" : "0");

答案 1 :(得分:3)

您可以使用LINQ来简化代码。

string.Join("", Enumerable.Range(0, 32).Select(i => (num >> (31 - i) & 1).ToString()))

答案 2 :(得分:1)

不是移动数字,而是移动掩码。从0x80000000开始,&它与数字。非零结果='1'。将掩模右移31次以检查所有位位置。

答案 3 :(得分:1)

此解决方案与您的解决方案类似,但它检查最重要的位(由0x80000000屏蔽,对应于二进制中的10000000000000000000000000000000),而不是最低有效位(由{{1}屏蔽})。

1

使用以下变体消除前导零:

uint g = 2323;

for (int i = 0; i < 32; ++i)
{
    Console.Write((g & 0x80000000) == 0 ? "0" : "1");
    g <<= 1;
}

答案 4 :(得分:0)

你是从左到右,所以它们是从左到右打印的:)

您可以在MSB中创建一个带1的掩码,并在每次迭代时将其右移1位(不要忘记创建掩码unsigned)。

可以通过将1向左移位32位来创建掩码,如

unsigned int mask = 1 << 32;

现在你可以每次向左移1位:

for(i = 0; i < 32; i++)
{
    Console.Write((g & mask == 0) ? "0" : "1");
    mask >>= 1;
}

注意: mask必须是无符号的,否则无论何时对其应用右移,MSB /符号位(即1)都将连续复制到位到左边。

但是,如果您每次创建面具,则不会有此要求:

for(i = 31; i >= 0; i++)
{
    Console.Write((g & (1 << i) == 0) ? "0" : "1");
    mask >>= 1;
}

此循环类似于代码中的循环。