#define _CRT_SECURE_NO_WARNINGS
心得: 计算机里存的是数字的二进制补码,任何对二进制的操作都是对补码的操作,但是显示却要使用原码来判断。
正数的原码 反码 补码都一样
负数的原码:最高位变成1,反码每一位求反,最高位不变,补码反码加一
左移:右边补零
右移:常用 左边补符号位
区别:sizeof(arr[10])代表整个数组的长度。为40字节。而strlen代表的是字符长度,要考虑到“abc”这种情况,strlen(“abc”)=3,实际还有个\0,sizeof()=4.
当一条语句中多次出现后置++的情况时,并不是一次后置++执行完成就修改一次 i 的值,而是整个语句执行过程中,i 的值都不发生变化,语句执行完成以后再修改 i 的值, 而前置++则是实时的修改 i 的值
判断某一位比特是否为1或者0时候,经常使用该数字与1与,然后右移一位,继续与1,这样就能判断出该位是否为1或者0。
代码:
//int main()
//{
// int ret = 10 % 3;//取模-得到之后余数
// int ret1 = 10 / 3;//除法-商
// printf("%d\n", ret);
// printf("%d\n", ret1);
//
//
// //当除号两端都是整数的时候,执行的是整数除法,两端只要有一个浮点数,执行的就是浮点数的除法
// double wet = 10.0 / 3.0;
// printf("%lf\n", wet);
// return 0;
//}
//移位操作符,只能是整数
//计算机中的正数 的原码 反码 补码都相同,复数的原码,最高位成为1 ,反码 最高位不变,其余取反,补码 反码加1
//在计算机里对数的任何操作都是对补码操作,因为计算机里存的是补码!!!!!!!!!!!补码操作完后,要转换成原码来进行显示,
//左移,右边补零
// 右移 左边补符号位
//位操作符也是对补码进行操作!!!
//int main()
//{
// int a = 3;
// int b = -5;
// int c = a ^ b;
// // int c = a&b;
// // int c = a|b;
// printf("%d\n", c);
// return 0;
//}
//赋值操作符
//复合操作符
//单目操作符
//!把真变成假,假变成真
//
//int main()
//{
//
// int a = 10;
// printf("%d\n", sizeof(a));
// printf("%d\n", sizeof(int));
//
//
//
//
// int arr[10] = { 1,2.3,4,5,6 };//这个数组的类型是去掉数组名,int [10]
// printf("%d\n", sizeof(arr));// 数组里有10个整型变量,前六个初始化了,后四的的空间还在,所以数组长度为40字节.strlen是代表数组里字符长度,sizeof是整个数组的长度
// printf("%d\n", sizeof(int[10]));
//
//
// int a = 0;
// printf("%d\n", ~a);//按位取反,还是对补码进行取反。然后得出原码,得出数。
// return 0;
//}
//int main()
//{
// int a = 10;
// // 00001010,把第三位的0变成1
// // 00000100 给上面的或一个这个就行,然后这个是通过 1左移两位得到的00001110
// //然后变回来 ,与11111011,得到00001010
// a |= (1 << 2);
// printf("%d\n", a);
//
// a &= ~(1 << 2);
// printf("%d\n", a);
// return 0;
// }
//int main()//当一条语句中多次出现后置++的情况时,并不是一次后置++执行完成就修改一次 i 的值,而是整个语句执行过程中,i 的值都不发生变化,语句执行完成以后再修改 i 的值,
而前置++则是实时的修改 i 的值
//{
// int a, b, c;
// a = 5;
// c = ++a;
// b = ++c, c++, ++a, a++;
// b += a++ + c;
// printf(“a = %d b = %d c = %d\n:”, a, b, c);
// return 0;
//}
#include<stdio.h>
//int set(int x, int y)
//{
// int tmp = x ^ y;
// int count = 0;
// while (tmp)
// {
// tmp = tmp&(tmp - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int m ;
// int n ;
// while (scanf("%d %d",&m,&n) == 2)
// {
// printf("%d\n", set(m,n));
// }
// return 0;
//}
//统计两个数不同位的个数
//int set(int x)
//{
// int count = 0;
// int i = 0;
// for (i = 0;i < 32;i++)
// {
// if ((x & 1) != 0)
// {
// count++;
// x = x >> 1;
// }
// else
// {
// x = x >> 1;
// }
// }
// return count;
//}
//int main()
//{
//
// int m, n;
// scanf("%d %d", &m, &n);
// int s = m ^ n;
// int c = set(s);
// printf("%d\n", c);
// return 0;
//}
//统计二进制数中的1的个数
//int set(int x)
//{
// int count = 0;
// while((x & 1) != 0)
// {
// x=x >> 1;
// count++;
// }
// return count;
//}
//
//
//int main()
//{
// int m = 0;
// scanf("%d", &m);
// int s = set(m);
// printf("%d\n", s);
// return 0;
//
//}
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// a = a ^ b;
// b = a ^ b;
// a = a ^ b;
// printf(“a=%d b=%d\n”, a, b);
//
//
// return 0;
//
//}
//显示二进制的奇数 和 偶数位
void set(int x)
{
int i = 0;
int e = 0;
int m = 0;
printf(“奇数位是”);
for (i = 31; i>=1; i=i-2)
{
m=x >> i;
e = m & 1;
printf("%d", e);
}
printf("\n");
printf("偶数位是");
for (i = 30; i >= 0; i = i - 2)
{
printf("%d", (x >> i) & 1);
}
printf("\n");
}
int main()
{
int m = 0;
scanf("%d", &m);
set(m);
return 0;
}