IO型--从main函数开始写,要写输入、计算、输出
接口型--不需要写主函数,默认主函数是存在的,你只需要完成函数就行
一、二进制中1的个数
(12条消息) C语言丨关键字signed和unsigned 的使用与区别详解_Emily-C的博客-CSDN博客_signed unsigned
十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1
二进制中1的个数__牛客网 (nowcoder.com)
1.模2得一位,除2去一位
int NumberOf1(unsigned int n) //unsigned无符号
{
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n = n / 2;
}
return count;
}
2.每执行一次,右边的1就没了
n=n&(n-1)
n=11(10进制)
n=1011
n-1=1010
n&(n-1)=1010
int NumberOf1(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);//
count++;
}
return count;
}
二、获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
void Print(int n)
{
int i = 0;
printf("奇数位: ");
for (i = 30; i >=0; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("偶数位: ");
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
}
int main()
{
int n = 0;
scanf("%d", &n);
Print(n);
return 0;
}
三、求两个数二进制中不同位的个数
(1)
int Dif(int n, int m)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) != ((m >> i) & 1))
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int ret=Dif(n,m);
printf("%d\n", ret);
return 0;
}
(2)
在C语言里这个符号“ ∧ ”表示“按位异或”运算符。
例:
^ 按位异或
AND (位与&) OR ( 位或| ) XOR ( 位异或^ )
1 & 1 = 1, 1 | 1 = 1, 1 ^ 1 = 0
1 & 0 = 0, 1 | 0 = 1, 1 ^ 0 = 1
0 & 1 = 0, 0 | 1 = 1, 0 ^ 1 = 1
0 & 0 = 0, 0 | 0 = 0, 0 ^ 0 = 0
//异或操作符
//相同为0,相异为1
int Dif(int n, int m)
{
int count = 0;
int tmp = m ^ n;//相同为0,相异为1
while (tmp)
{
tmp = tmp & (tmp - 1);//去掉最右边的1
count++;
}
return count;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int ret=Dif(n,m);
printf("%d\n", ret);
return 0;
}