目录
//编写代码实现:求一个整数存储在内存中的二进制中1的个数。
注:阅读此章需要掌握二进制转换;若有所欠缺,请阅最后部分;
算数操作符:+ - * / %
#include <stdio.h>
int main()
{
//除法
float a1 = 10 / 3; //3.00000 整数相除
float a2 = 10 / 3.0; //3.33333 精确到小数后,一边需要是小数的形式
printf("a1=%f\na2=%f\n", a1, a2);
//%
float a3 = 10 % 3; //两端必须都是整数
//float a2 = 10 % 3.0; //err
printf("a3=%f\n", a3);
return 0;
}
位移操作符:>> <<
int main()
{
//移位操作符
//左位移符 <<
int num1 = 5;
int num2 = -2;
printf("%d", num1<<1);
// 原 :00000000 00000000 00000000 00000101 (正数原反补一样)
// <<1: 00000000 00000000 00000000 00001010 10
printf("%d", num2<<1);
// 原: 10000000 00000000 00000000 000000010
// 反: 11111111 11111111 11111111 111111101
// 补: 11111111 11111111 11111111 111111110
// <<1: 11111111 11111111 11111111 111111100
// 反: 11111111 11111111 11111111 111111011
// 原: 10000000 00000000 00000000 000000100 -4
//右移操作数
// 1.右边丢弃,左边补原符号 合理
// 2.右边丢弃,左边补0 (用哪一种,看编译器)
printf("%d", num1 >> 1);
// 原:00000000 00000000 00000000 00000101
// >>1:00000000 00000000 00000000 00000010 2
printf("%d", num2 >> 1);
// 原:10000000 00000000 00000000 00000001
// 反:11111111 11111111 11111111 11111110
// 补:11111111 11111111 11111111 11111111
// >>1 11111111 11111111 11111111 11111111 右移
// 补: 11111111 11111111 11111111 11111110 -1
// 反: 10000000 00000000 00000000 00000001 取反
// -1
//注意位移符不要移位负数 num2>>-1
return 0;
}
位操作符:& ^ |
#include <stdio.h>
int main()
{
//& ^ |
//按位与: &有0为0,全1为一
//按位或: |有1为1;全0为0
//按位异或: ^相同为0,不同为1
int num1 = 2;
int num2 = 3;
printf("%d", num1 & num2); //1
//00000000 00000000 00000000 00000001
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000001
printf("%d", num1 | num2); //3
//00000000 00000000 00000000 00000001
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000011
printf("%d", num1 ^ num2); //2
//00000000 00000000 00000000 00000001
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000010
return 0;
}
位操作符训练:两数交换;
#include <stdio.h>
int main()
{
int num1 = 2;
int num2 = 3;
//异或 2 3 仅仅适用于正整数交换
num1 = num1 ^ num2; // 010 011 = 001
num2 = num1 ^ num2; // 001 011 = 010(2)
num1 = num1 ^ num2; // 001 010 = 011(3)
return 0;
}
//编写代码实现:求一个整数存储在内存中的二进制中1的个数。
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while (num)
{
count++;
num = num & (num - 1);
}
printf("二进制中1的个数 = %d\n", count);
//方法二:
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((num1 >> i) & 1) == 1)
count++;
}
printf("num1二进制有%d个1", count);
return 0;
}
方法一:
不断使用按位与进行除1;将结果用于下一次继续比较;直到把全1变为0;循环了多少次,就有多少的1;
方法二:
每次循环会将num1的二进制向右移一位,随后与1的二进制比对,结果为1;则count++;
循环32次结束,count记录num1中二进制有多少1;
逻辑操作符:
int main()
{
//逻辑操作符
//&& 两个表达式,左边为假,右边则不会执行
//|| 两个表达式,左边为真,右边则不会执行
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = ++a && ++b && d++;
printf("%d %d %d",a,b,c);
return 0;
}
条件操作符 exp1?exp2 : exp3
int a = 0;
int b = 0;
//表达式为真执行a++.为假b++
a>b?a++:b++;
printf("%d %d",a,b);
逗号操作符
(exp1,exp2,exp3,exp4) 整个表达式最后结果以exp4为准,,,前面的表达式也会执行
二进制计算
二进制分别有 原码:通过位来计算对应数值
反码:原码的基础上,符号位(二进制首位,0为正,1为负)不变,其余取反
补码:反码的基础上,+1
5的反码:01111111 11111111 11111111 11111010
5的补码: 01111111 11111111 11111111 11111011