我想将十进制数显示为位。
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)
的数字我可以向左移动但是然后:我可能会异常......(数字太大)
我需要在代码中更改以显示正确的内容,但是:
有什么事吗?
答案 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;
}
此循环类似于代码中的循环。