#include <stdio.h>
#include <math.h>
int main()
{
int n,i,j;long long p,sum=0,count;
scanf("%d",&n);
long long a[n];
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
for(j=0;j<64;j++)
{
count=0;
p=pow(2,j);
for(i=0;i<n;i++)
{
**if(a[i]&p)**
count++;
}
sum+=(count*(count-1)*p/2);
}
printf("%lld",sum);
return 0;
}
if for循环中的if语句在这里做什么? 为什么&amp;在程序中使用?
答案 0 :(得分:1)
按位AND运算符是单个&符号:&amp ;.一个方便的助记符是 小版本的布尔AND,&amp;&amp;,适用于较小的部分 (位而不是字节,字符,整数等)。本质上是一个二进制 AND简单地获取a的每个位置中的位的逻辑AND 二进制形式的数字。
例如,使用字节(char类型):
EX。
01001000 &
10111000 =
--------
00001000
第一个数字的最高有效位为0,因此我们知道结果的最高有效位必须为0;在第二个最高有效位中,第二个数字的位为零,因此我们得到相同的结果。两个位都是1的唯一时间,即结果为1的唯一时间,是左起第五位。因此,
72 & 184 = 8
更多示例
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
答案 1 :(得分:0)
&
是按位AND运算符。它听起来像是 - 并且每个位都有操作符。在您的情况下,如果p = 2^k
,a[i]&p
检查机器的a[i]
的二进制表示是否将第k位设置为1
。
答案 2 :(得分:0)
AND 运算符比较两个给定的输入位,如果两个位均为1,则将结果设为1.否则为0。