我最近正在学习C#,其中我遇到了以下for循环
// Display the bits within a byte.
using System;
class ShowBits {
static void Main() {
int t;
byte val;
val = 123;
for(t=128; t > 0; t = t/2) {
if((val & t) != 0)
Console.Write("1 ");
if((val & t) == 0)
Console.Write("0 ");
}
}
}
我无法理解为什么在for循环的递增/递减部分执行t = t / 2。请解释
答案 0 :(得分:5)
十进制128是二进制10000000 - 即仅用于字节的最高有效位的掩码。当你将它除以2时,得到01000000,即第二最高有效位等。
在原始值和掩码之间使用&
,只与0比较表示该位是否设置为原始值。
另一种选择是改变原始值:
for (int i = 7; i >= 0; i--)
{
int shifted = val >> i;
// Take the bottom-most bit of the shifted value
Console.Write("{0} ", shifted & 1);
}
答案 1 :(得分:3)
t用作val
中位的掩码
所以从二进制的128,10000000开始
当它除以2时,它变为64 - 或01000000
直到达到0为止。
然后在每次迭代中,'&'用于使用val
中的当前位掩码t
中的位。
答案 2 :(得分:3)
循环减少2的幂并在掩码中使用该值。
(基数10):128,64,32,16,8,4,2,1
(基数2):10000000,010000,00100000,00010000,00001000,00000100,00000010,00000001
答案 3 :(得分:3)
128以二进制形式写成10000000
,因此我们检查一个字节中的最高位是否打开。然后我们做t = t / 2,它是t=128/2=64
,它以二进制形式写成01000000
,依此类推。任何一个部门都将一个地方的一位移到右边。