怎么让网站无法自适应,wordpress图片排列显示,新闻头条最新消息30字,中国购物平台前言#xff1a;本节内容介绍的操作符#xff0c;操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍
1.二进制介绍
#xff08;1#xff09;整数的二进制表示形式有三种#xff1a;原码、反码和补码。
#xff08;2#xff09;原码、反码和补码的…
前言本节内容介绍的操作符操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍
1.二进制介绍
1整数的二进制表示形式有三种原码、反码和补码。
2原码、反码和补码的长度有数据类型来决定如整数就是四个字节转化后是三十二位比特位所以一个整数写成二进制序列的时候是32个bit位。
3数据是以补码的形式在内存中存储的。
4正负数原码、反码和补码不一样
2.正数三码的介绍
1正数的原码、反码和补码都一样不需要计算可以直接得出来。
2举例
7我们先把7转化成二进制数111由于整数的二进制序列是32位所以其他我需要补0就写成这样 原码00000000 00000000 00000000 00000111 反码00000000 00000000 00000000 00000111 补码00000000 00000000 00000000 00000111 3二进制数为11 二进制序列 原码00000000 00000000 00000000 00000011 反码00000000 00000000 00000000 00000011 补码00000000 00000000 00000000 00000011 3.负数三码的介绍
我们接下来重点介绍负数的原码、反码和补码
1原码
对于有符号的整数来说最高位的一位是符号位符号位是1表示负数符号位是0表示正数。若是无符号数没有符号位所有位都是有效位。数字0则当成无符号数来看待。
正数 负数
对于有符号数来说正负数原码的差异就是在最高位。
2反码
1.反码顾名思义就是取反。
定义反码是在原码的基础上除了符号位其他按位取反1的话就写成00就写成1。 2.-7的反码 原码10000000 00000000 00000000 00000111 反码11111111 11111111 11111111 11111000 3补码
1.定义补码则是在反码的基础上1。 2.-7的补码 原码10000000 00000000 00000000 00000111 反码11111111 11111111 11111111 11111000 补码11111111 11111111 11111111 11111001 而补码就是数据在内存中的存储形式。所以整数在计算的时候使用的也是补码。 总结三码的转换规则原码----(取反)---反码-----(1)----补码
补码----(-1)---反码----取反---原码
补码----(取反1)---原码
二、移位操作符
前言移位操作符包括左移操作符和右移操作符
1.左移操作符
(1)常用口诀左边丢弃右边补0
(2)代码演示
#includestdio.h
int main()
{int a 7;int b a 1;//a向左移动一位printf(%d\n,a);//a的本质没有改变printf(%d\n,b);return 0;
}
代码结果 由上面很清楚的就可以知道其实a的值还是-7没有改变。
代码演示2
#includestdio.h
int main()
{int a -7;//将a的值改成负数int b a 1;int c a 2;printf(%d\n,a);printf(%d\n,b);printf(%d\n,c);return 0;
}
运行结果 两次代码演示初步总结左移一位结果在原数据基础上×2左移两位结果在原数据基础上×3但原数据的值不会改变。
3左移符号解析
左移符号移动的是补码但是打印的时候打印的是原码。
正数左移7 原码00000000 00000000 00000000 00000111 反码00000000 00000000 00000000 00000111 补码00000000 00000000 00000000 00000111 正数的左移比较容易看出来因为原码、反码和补码都相同 负数右移-7 原码10000000 00000000 00000000 00000111 反码11111111 11111111 11111111 11111000 补码11111111 11111111 11111111 11111001 总结 无论正数还是负数左移的结果都会×2。 记忆口诀左边丢弃右边补0。 2.右移操作符
1右移操作符分类
右移操作符包括算术右移和逻辑右移 逻辑右移右边直接丢弃左边补0 算术右移右边直接丢弃左边补原符号位正数补0负数补1-----------常用选择 我们下面的例子也都用算术右移来演示
2代码演示
#includestdio.h
int main()
{int a 10;int b a 1;printf(%d\n, a);printf(%d\n, b);int c -10;int d c 1;printf(%d\n, c);printf(%d\n,d);return 0;
}
运行结果 其实不难发现算术右移其实也有一种÷2的效果。 3右移图示解析 总结大多数编译器都是使用算术右移效果相当于÷2 算术右移口诀右边丢弃左边补原符号位 3.左移、右移总结
1移动的对象只能是整数
2只能移动正整数位比如左移一位、右移两位。
3移动后不会改变原数据的值
4移动的是二进制的补码打印的结果是二进制的原码
三、位操作符
前言位操作符的对象仍然是二进制的补码他们必须有两个操作对象
1.按位与
1定义
两个对象的补码比较相同位有0则结果位0相同位都是1结果才为1。 2代码演示
#includestdio.h
int main()
{int a 5;int b 7;int c a b;//将按位与的结果赋值给cprintf(%d\n,c);return 0;
} 运行结果 3代码分析
我们先列出5和7的补码 5的补码00000000 00000000 00000000 00000101 7的补码00000000 00000000 00000000 00000111 图解
4实列讲解
根据有0为0两个1才为1的特点可以按位与1来确定最低一位最右一边是1或者0。
代码演示
#includestdio.h
int main()
{int a 3;int b a 1;printf(%d\n,b);return 0;
}
运行结果 结果分析 3的补码00000000 00000000 00000000 00000011 1的补码00000000 00000000 00000000 00000001 所以任何数按位与1得出的结果为1则该数的二进制最低为是1如果是0则最低为是0。当然要知道该数的二进制序列的所以1则需要配合右移符号使用后续补充 2.按位或|
1定义
二进制序列对应位上有1则为1两个相同才为0。 2代码演示
#includestdio.h
int main()
{int a 5;int b -3;int c a | b;//按位或printf(%d\n,c);return 0;
} 运行结果 3代码解读 5的补码00000000 00000000 00000000 00000101 -3的补码11111111 11111111 11111111 11111101 3.按位异或^
1定义
对应的二进制位相同为0相异为1 由此而来的知识点a^a0 a^0a 2代码演示
#includestdio.h
int main()
{int a 5;int b -3;int c a ^ b;//按位异或printf(%d\n, c);return 0;
}
运行结果 3代码解读 5的补码00000000 00000000 00000000 00000101 -3的补码11111111 11111111 11111111 11111101 4实例讲解
题目在不借助第三方变量的情况下交换两个变量的值
代码演示
#includestdio.h
int main()
{int a 520;int b 1314;a a ^ b;b a ^ b;//此时的aa^ba a ^ b;printf(a%d b%d\n,a,b);return 0;
}
运行结果 代码解读 第一步aa^b这个结果先不要算出来 第二步ba^b这个时候左边的aa^b所以整个等式变成ba^b^b因为b^b0且a^0a所以此时就将a的值赋给了b 第三步aa^b此时左边的aa^bba所以左边a^b^ab,所以就将b赋值给了a完成两个数的交换 四、某些复合赋值操作符和一个单目操作符
前言操作对象都是二进制的补码
1.复合赋值操作符
1赋值操作符的介绍 右移等 左移等 按位与等 | 按位与等 ^ 按位异或等 2使用方法
上面的这些符号就多了一个等号就如同一样
代码举例
#includestdio.h
int main()
{int a 5;a a 1;//普通写法a 1;//复合写法a a 1;a 1;a a 2;a 2;//复合写法a a | 4;a | 4;a a ^ 1;a ^ 1;return 0;
}
2.一个单目操作符
1定义~一个波浪号
作用对一个数的二进制按位取反
2代码演示
#includestdio.h
int main()
{int a 0;printf(%d\n,~a);//单目操作符return 0;
}
运行结果 3例子
#includestdio.h
int main()
{int a 10;a | (1 4);//控制二进制将10变成26printf(%d\n,a);//再将26变回10a (~(1 4));printf(%d\n,a);return 0;
} 10的补码00000000 00000000 00000000 00001010 26的补码00000000 00000000 00000000 00011010 10变成26 26变回10只需将该位置按位与上0即可