#include<stdio.h>
//操作符
//int main()
//{
// //double 去模操作符 两边必须是整数类型操作符
// //移位操作符 <<--左移操作符 >>--右移操作符 移动的是二进制位 !!!!!(int a a-4个字节 32bit)
//
// //移位操作符 不能移动负数位 ;只能作用于浮点数!!!!!!!!!!
//
// //算术右移 :左边补原符号位
// //逻辑右移:左边补0
// //int a = -1;
// //int b = a >> 1;
// //printf("%d\n", b);//输出还是-1;所以还是算术移位的方式
// //相当于右移一位有 (除2)的效果 !!!!!!!!!
// //左移:相当于右边补0,左边丢弃!!!!!!!!
// //相当于左移一位 是由(乘2)的效果
//
// return 0;
//}
//int main()
//{
// //按位 与 & , 或 | , 异或 ^ (只能作用于整数 !!!!!)--按二进制!!!!!
//
////交换两个变量值 不使用新变量!
// int a = 3;
// int b = 5;
// //相减法:(a,b整形值)此方法有缺陷!!!!!-可能会溢出
// //a = a + b;
// //b = a - b;
// //a = a - b;
// //printf("a=%d b=%d\n", a, b);
// //逻辑异或法:!!!!!!!!
// a = a^b;//(a:011^b:101=110;相同为0,不同为1;)
// b = a^b;//(a:110^b101=011:)
// a = a^b;//(a:110^b011=101)
// printf("a=%d b=%d\n", a, b);
//
// return 0;
//}
//统计一个数在内存当中的二进制当中的1的个数
int main()
{
int num = 0;//int 整形32bit
int count = 0;
scanf_s("%d", &num);
//就是统计 num 的补码当中有多少个 1
//法一:有问题!!!!!
//while (num)//num!=0
//{
// if (num % 2 == 1)
// {
// count++;
// num = num / 2;
// }
//法二:
int i = 0;
for (i = 0; i < 32;i++)
{
if(1==((num>>1)&1))
{
count++;
}
printf("%d\n", count);
}
return 0;
}
//int main()
//{
// short s = 0;
// int a = 10;
// printf("%d", sizeof(s = a + 5));//2--因为短整形只能存2个字节!!!!!
// printf("%d", s);//0 sizeof(里的表达式是不参与运算的)
//
//
////~:取反 (二进制)
//
////(类型):强制类型装换
// //int a=(int)3.1415926 强制其转换成int 类型的变量
//
////char 长度是1 但是地址传过去是4个字节
// //void a(char b[]){printf("%d",sizeof(b);} int main(){ char b[10]={0};} -----printf输出是是 4 因为传过去的是首元素的地址 是4个字节!!!!!!
//
// return 0;
//}
//int main()
//{
////逻辑与 或 && ||
// // int a = 3;
// // int b = 5;
// // printf("%d\n", a&&b);
// //
//////单位与 或 & | -看其二进制 的
// // printf("%d\n", a&b);
//
//
// int i = 0, a = 0,b = 2, c = 3, d = 4;
// i = a++&&++b&&d++;//a=0&&..=0 并且 左边 有一个=0 时逻辑与不再向右继续进行!!!!!!!!!!
// printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
// i = a++ || ++b || d++;//a=1||..=1 并且 左边 有一个=1 时逻辑或不再向右继续进行!!!!!!!!!!
// printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
//
// return 0;
//}
int main()
{
//条件操作符 exs?test1:test2;如果esx为1 test1;如果esx为2 test2. 可以赋值a=(exs?test1:test2)
//逗号表达式:a=(test1,test2,test3.....testn); a=testn.逗号表达式最后的一个表达式的值
//下标引用操作符:[] 一个数组名+一个索引道(基本上是对于数组而言的)
//
char a = 1;
printf("%u\n", sizeof(a));//1 char是所占一个字节大小
printf("%u\n", sizeof(+a));//4 +a是转化成一个整形类型大小 4个字节
printf("%u\n", sizeof(!a));//1
//操作符的优先级
//操作符类型相同时:按顺序L-R
//表达式当中出现小于int类型的操作符 (char,short>都会先转换成int之后再运算!!!!!
//--操作符预算优先级在+前
return 0;
}