我有以下代码
int n = 50;
while(n) { //1
if(n & 1) cout << "1" << endl; //2
//right shift the number so n will become 0 eventually and the loop will terminate
n >>= 1; //3
}
当我们使用按位和1(&amp; 1)数字时,我们得到相同的数字。 现在我的问题是c ++如何评估以下表达式:n&amp; 1。 时间:
n = 50
In binary form 50 is: 110010
If we bitwise 1 then we get: AND 1 = 110010
Now in c++ (2) the expression evaluates like this:
Instead of getting the whole sequence of bits (110010) bitwise anded with 1
it evaluates only the number of right bits we bitwise. In my example:
n=50, 110010, use n & 1 ==> 0 AND 1 instead of 110010 AND 1.
c ++是否有理由对待这种情况?我的猜测是它与编译器有关吗?
答案 0 :(得分:2)
当我们使用按位和1(&amp; 1)和数字时,我们会得到相同的数字。
不,我们不。我们返回由原始数字和1中设置的位组成的数字。由于只设置了最低位1,因此结果是原始数字的最低位。
现在我的问题是c ++如何评估以下表达式:n&amp; 1。
如果n
为50,则为二进制:
n: 110010
1: 000001
n&1: 000000 // no bits set in both
如果n
为51,则为二进制:
n: 110011
1: 000001
n&1: 000001 // one bit set in both
答案 1 :(得分:2)
按位AND运算符是单个&符号:&amp ;.它只是AND的表示,它对操作数的位而不是操作数的真值进行处理。按位二进制AND以二进制形式对数字的每个位置中的位进行逻辑AND(如上表所示)。
在您的示例中110010
&amp; 1
,1
被视为000001
,然后每位都是anded
,您就会得到结果。实际上,我使用这种方法:1&number
来检查偶数和奇数。这是如何:
if(1 & num)
printf("it is odd");
else
printf("it is even");
这是它的工作原理:假设你有一个8位数。现在,1
的8位表示法将为00000001
。
如果我现在对每个位执行and
,对于所有前七位,我将获得0
,因为它将是0 & anything
将为0.现在,最后一位1
是1.因此,如果我的号码的最后一位也是1
,那么1 & 1 = 1
,如果我的最后一位是0
,那么1 & 0 = 0
。
我的号码中的最后一位何时才会1
?当0
时?转换为十进制形式时,最后一位乘以2 0 。并且,2 0 = 1.如果此1
乘以1,我们得到一个奇数,如果它乘以0,我们得到一个偶数。