老师,是这样理解吗

老师,是这样理解吗

老师,课程中未详细讲解按位运算符,麻烦看下所有的理解是否正确

按位运算

二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算;

序号 表达式 意义 例子
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转为二进制,得到117转为二进制,得到111011    # 3的二进制,位数不足,前面以0补齐
    111    # 7的二进制
_________
    011    # 两者都为1,则运算后的值为1,只要有一个为0,得到的就是0;
    
得到结果为二进制数011,也就是十进制数 3# 示例
9 & 16

9  转为二进制,得到100116 转为二进制,得到1000001001    # 9的二进制,位数不足,前面以0补齐
  10000    # 16的二进制
_________
  00000    # 两者都为1,则运算后的值为1,只要有一个为0,得到的就是0;
    
得到结果为二进制数00000,也就是十进制数 0

|(位或运算符):

  • 先将操作数转换为对应的二进制数字
  • 个位对个位,十位对十位…,不足位数的,前面通通以0补齐;
  • 不同的是,参与运算时,只要有一个为1,得到的就是1,两者都为0,得到的就是0;
# 示例
3 | 7

3转为二进制,得到117转为二进制,得到111011    # 3的二进制,位数不足,前面以0补齐
    111    # 7的二进制
_________
    111    # 只要有一个为1,得到的就是1,两者都为0,得到的就是0;
    
得到结果为二进制数111,也就是十进制数 7# 示例
9 | 16

9  转为二进制,得到100116 转为二进制,得到1000001001    # 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转为二进制,得到117转为二进制,得到111011    # 3的二进制,位数不足,前面以0补齐
    111    # 7的二进制
_________
    100    # 两个都为0或者都为1时,那么取值为0;只有一个为0,一个为1时,取值为1;
    
得到结果为二进制数100,也就是十进制数 4# 示例
9 ^ 16

9  转为二进制,得到100116 转为二进制,得到1000001001    # 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回答

同学你好,同学提供的文档中,本质都是正确的,但是有些小问题,如下:

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”,两个示例的运算结果是正确的。

祝学习愉快~

  • Lanny_Chung 提问者 #1

    老师,其他的问题都理解了,对于第五点,还有点疑问;
    老师说是否需要填补 0/1,是针对固定位数而言的,这里的固定位数,是和位取反运算符那一样吗,即根据数据类型决定是否需要补位否?

    2024-06-03 10:03:28
  • 好帮手慕小蓝 回复 提问者 Lanny_Chung #2

    同学你好,老师对MySql的二进制存储不是很了解,所以TINYINT类型位置没有专门进行标注。但是同学在右移运算符提到了补0或者1,这和Java中存储数据的方式是一致的,固定位数是需要处理标志位的。老师这边只对MySql存储有简单的理解,不同的整数类型存储时确实是有区别的,所以这里使用Java的存储方式补充了一点知识。

    对于同学的问题,在Java中,取反运算不会影响标志位,而TINYINT类型本身不是有标志位的数据类型,由于没有标志位,所以不存在对标志位操作的问题。

    综上,如果同学案例中都是TINYINT类型,那么右移是不需要考虑补0或者1的。相反,既然考虑补0或者1,那么就应当不是TINYINT类型。所以建议同学对这部分再确认一下,老师这边确实不是很了解MySql的存储,所以不能确定。

    如果同学确实对二进制有兴趣,可以专门搜索一些文献,能有更完整的理解。

    祝学习愉快~

    2024-06-03 10:31:26
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1203    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师