老师,是这样理解吗
老师,课程中未详细讲解按位运算符,麻烦看下所有的理解是否正确
按位运算
二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算;
序号 表达式 意义 例子 1 & 位与关系 3 & 7 2 | 位或关系 3 | 7 3 ~ 位取反 ~10 4 ^ 位异或 3 ^ 7 5 << 左移 10 << 1 6 >> 右移 10 >> 1 &(位与运算符):
- 先将操作数转换为对应的二进制数字;
- 个位对个位,十位对十位…,不足位数的,前面通通以0补齐;
- 参与运算,两者都为1,则运算后的值为1,只要有一个为0,得到的就是0;
# 示例 3 & 7 3转为二进制,得到11; 7转为二进制,得到111; 011 # 3的二进制,位数不足,前面以0补齐 111 # 7的二进制 _________ 011 # 两者都为1,则运算后的值为1,只要有一个为0,得到的就是0; 得到结果为二进制数011,也就是十进制数 3 ; # 示例 9 & 16 9 转为二进制,得到1001; 16 转为二进制,得到10000; 01001 # 9的二进制,位数不足,前面以0补齐 10000 # 16的二进制 _________ 00000 # 两者都为1,则运算后的值为1,只要有一个为0,得到的就是0; 得到结果为二进制数00000,也就是十进制数 0 ;
|(位或运算符):
- 先将操作数转换为对应的二进制数字
- 个位对个位,十位对十位…,不足位数的,前面通通以0补齐;
- 不同的是,参与运算时,只要有一个为1,得到的就是1,两者都为0,得到的就是0;
# 示例 3 | 7 3转为二进制,得到11; 7转为二进制,得到111; 011 # 3的二进制,位数不足,前面以0补齐 111 # 7的二进制 _________ 111 # 只要有一个为1,得到的就是1,两者都为0,得到的就是0; 得到结果为二进制数111,也就是十进制数 7 ; # 示例 9 | 16 9 转为二进制,得到1001; 16 转为二进制,得到10000; 01001 # 9的二进制,位数不足,前面以0补齐 10000 # 16的二进制 _________ 00000 # 只要有一个为1,得到的就是1,两者都为0,得到的就是0; 得到结果为二进制数1101,也就是十进制数 25 ;
~(位取反运算符):
- 先将操作数转换为对应的二进制数字
- 个位对个位,十位对十位…,不足位数的,前面通通以0补齐;
- 参与运算时,对每个位上的数进行取反,即原本是0,取1,原本是1,取0;
- 需要注意的是,如果是有符号范围,将会超过存储范围,会被系统进行阶段,导致数据不精确;
# 示例 ~3 3转为二进制,得到11; # 根据数据类型决定,前面需要补充多少位; # 比如:TINYINT 类型的整数在 MySQL 中占用 1 个字节(8 位),那么需要补足8位数; 00000011 # 3的二进制,位数不足,前面以0补齐 _________ 11111100 # 对每个位上的数进行取反,即原本是0,取1,原本是1,取0; 得到结果为二进制数11111100,也就是十进制数 252 ; # 示例 ~123 123转为二进制,得到1111011; # 根据数据类型决定,前面需要补充多少位; # 比如:SMALLINT 类型的整数在 MySQL 中占用 2 个字节(16 位),那么需要补足16位数; 0000000001111011 # 123的二进制,位数不足,前面以0补齐 _________________ 1111111110000100 # 对每个位上的数进行取反,即原本是0,取1,原本是1,取0; 得到结果为二进制数1111111110000100,也就是十进制数 65412 ;
^(位异或运算符):
- 先将操作数转换为对应的二进制数字
- 个位对个位,十位对十位…,不足位数的,前面通通以0补齐;
- 参与运算时,当同位上的数,两个都为0或者都为1时,那么取值为0;只有一个为0,一个为1时,取值为1;
# 示例 3 ^ 7 3转为二进制,得到11; 7转为二进制,得到111; 011 # 3的二进制,位数不足,前面以0补齐 111 # 7的二进制 _________ 100 # 两个都为0或者都为1时,那么取值为0;只有一个为0,一个为1时,取值为1; 得到结果为二进制数100,也就是十进制数 4 ; # 示例 9 ^ 16 9 转为二进制,得到1001; 16 转为二进制,得到10000; 01001 # 9的二进制,位数不足,前面以0补齐 10000 # 16的二进制 _________ 11001 # 两个都为0或者都为1时,那么取值为0;只有一个为0,一个为1时,取值为1; 得到结果为二进制数11001,也就是十进制数 25 ;
<<(左移运算符):
- 先将操作数转换为对应的二进制数字;
- 根据指定的左移数
n
,将整体的二进制数左移n
位,左边会空出 n 位,这些空出的位会被填充为 0;# 示例 3 << 2 3转为二进制,得到11; # 左移数为2,则11向左移动两位,右边空出两位,即1100 11 => 1100 得到结果为二进制数1100,也就是十进制数 12 ; # 示例 9 << 4 9 转为二进制,得到1001; # 左移数为2,则11向左移动两位,右边空出两位,即1100 1001 => 100100 得到结果为二进制数100100,也就是十进制数 36 ;
>>(右移运算符):
- 先将操作数转换为对应的二进制数字;
- 根据指定的右移数
n
,将整体的二进制数右移n
位,右边会空出 n 位,这些空出的位会被填充为 0或1(正数填充为0,负数填充为1),右边所移动的位数,需要从末尾截掉;# 示例 53 << 2 53转为二进制,得到110101; # 右移数为2,则110101向右移动两位,左边空出两位,即00110101,截掉移动的位数,得到001101,也就是1101 110101 => 1101 得到结果为二进制数1101,也就是十进制数 13 ; # 示例 12 << 2 12转为二进制,得到1100; # 右移数为2,则1100向右移动两位,左边空出两位,即001100,截掉移动的位数,得到0011,也就是11 1100 => 11 得到结果为二进制数11,也就是十进制数 3 ;
正在回答
同学你好,同学提供的文档中,本质都是正确的,但是有些小问题,如下:
1.“9 | 16”的示例中,结果二进制数据应为“11001”,即十进制的25,同学这里有笔误;
2.位取反运算符中,是不需要第二条的“个位对个位...”的,这里的条件应当是,根据数据类型补齐位数,即每1个字节8位;
3.左移运算符的第二条中,“左边会空出 n 位”,实际上是右边,右边的位会被0补齐;
4.左移运算符的第二个示例“9 << 4”,是二进制“1001”向左移动四位,即“10010000”,对应十进制是144;
5.右移运算符的第二条中,“右边会空出 n 位”,实际上是左边。另外,此处补填0或者1,是针对固定位数时,表达正负值的标志位而言的,如果不考虑标志位,是不需要补填的。例如1字节固定是8位(1个标志位,7个数据位),如果右移两位之后,原标志位会变成数据位,此时只有6个数据位,需要补齐的两位为,1个标志位和1个数据位。此时的标志位才是需要补齐0或者1的。
6.右移运算符的示例中,错误的使用了左位移符号,例如“53 << 2”应为“53 >> 2”,两个示例的运算结果是正确的。
祝学习愉快~
相似问题
登录后可查看更多问答,登录/注册
- 参与学习 2020 人
- 提交作业 1249 份
- 解答问题 1203 个
2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星