java 位运算和关于二进制的一些理解

2 篇文章 0 订阅

目录

 

一、概述

 二、位移运算 >>  <<  >>>

①. >>:将一个数右移 最高位是0,则左边补齐0;如果最高位为1,则左边补齐1

②. <<:将一个数左移 左边最高位直接丢弃,右侧补齐0

③. >>>:无符号右移,直接左侧补齐0,不管最高位是0或者1

 三、位运算 &   |   ^   ~

①. &:按位 于 运算,将相同位置的二进制进行 与 运算:如果有0则结果为0,如果都为1,则结果为1

②. |:按位 或 运算,将相同位置的二进制进行 或 运算:如果有1则结果为1,如果都为0则结果为0

③. ^:按位 异或 运算,将相同位置的二进制进行 异或 运算:如果相同则结果为0,如果不同则结果为1

④. ~:按位 取反 运算, 二进制进行 取反运算:将1变为0,0变为1,进行取反操作


一、概述

二进制包含有: 原码、反码、补码,且正数的原码、反码、补码一样;

原码:直接计算得到的二进制码

反码:对二进制码取反,如:二进制码为 0001010 则反码为 1110101 最高位为符号位,不变

补码:对二进制反码 加一,如反码为 1110101  则补码为:1110110

根据补码得原码,过程与通过原码得补码相反。

二进制的操作,都对补码进行操作,而我们算出来的都是原码,所以需要先转换为补码,再运算,运算完成再转回原码(正数不需要转换,因为三个码一样)

 二、位移运算 >>  <<  >>>

①. >>:将一个数右移 最高位是0,则左边补齐0;如果最高位为1,则左边补齐1

如9>>2:转换二进制:00000000 00000000 00000000 00001001
                                右移2:00000000 00000000 00000000 00000010  丢掉了最右边的两位-01,左边补0
                              结果是:2

如-9>>2:转换二进制:10000000 00000000 00000000 00001001(因为负数,需要取补码)
                                   反码:11111111 11111111 11111111 11110110
                                   补码:11111111 11111111 11111111 11110111
                      对补码右移2:11111111 11111111 11111111 11111101  丢掉了最右边的两位-11,左边补1(因为负数,最高位为1)
                                   反码:11111111 11111111 11111111 11111100
                                   源码:10000000 00000000 00000000 00000011
                               结果是:-3

②. <<:将一个数左移 左边最高位直接丢弃,右侧补齐0

如9<<2:转换二进制:00000000 00000000 00000000 00001001
                                左移2:00000000 00000000 00000000 00100100  丢掉了最左边的两位-00,右边边补0
                               结果是:36

如-9<<2:转换二进制:10000000 00000000 00000000 00001001(因为负数,需要取补码)
                                   反码:11111111 11111111 11111111 11110110
                                   补码:11111111 11111111 11111111 11110111
                      对补码左移2:11111111 11111111 11111111 11011100  丢掉了最左边的两位-11,右边边补0
                                   反码:11111111 11111111 11111111 11011011
                                   源码:10000000 00000000 00000000 00100100
                               结果是:-36

③. >>>:无符号右移,直接左侧补齐0,不管最高位是0或者1

如9>>>2:转换二进制:00000000 00000000 00000000 00001001
                                  右移2:00000000 00000000 00000000 00000010  丢掉了最右边的两位-01,右边边补0
                                结果是:2

如-9>>>2:转换二进制:10000000 00000000 00000000 00001001(因为负数,需要取补码)
                                     反码:11111111 11111111 11111111 11110110
                                     补码:11111111 11111111 11111111 11110111
                        对补码右移2:00111111 11111111 11111111 11111101(因为已经是正数,补码、反码、源码一致)
                                 结果是:1073741821

 三、位运算 &   |   ^   ~

①. &:按位 于 运算,将相同位置的二进制进行 与 运算:如果有0则结果为0,如果都为1,则结果为1

如9 & 10:转换二进制:00000000 00000000 00000000 00001001
                                       &
                                       00000000 00000000 00000000 00001010
                                       =
                                       00000000 00000000 00000000 00001000
                       最终结果为 8

②. |:按位 或 运算,将相同位置的二进制进行 或 运算:如果有1则结果为1,如果都为0则结果为0

如9 | 10:转换二进制:00000000 00000000 00000000 00001001
                                      |
                                     00000000 00000000 00000000 00001010
                                     =
                                     00000000 00000000 00000000 00001011
                        最终结果为 11

③. ^:按位 异或 运算,将相同位置的二进制进行 异或 运算:如果相同则结果为0,如果不同则结果为1

如9 ^ 10:转换二进制:00000000 00000000 00000000 00001001
                                       ^
                                      00000000 00000000 00000000 00001010
                                      =
                                      00000000 00000000 00000000 00000011
                        最终结果为 3

④. ~:按位 取反 运算, 二进制进行 取反运算:将1变为0,0变为1,进行取反操作

如 ~9:转换二进制 00000000 00000000 00000000 00001001
                                =
                               11111111 11111111 11111111 11110110
    得到结果是补码,因为最高位为1是负数,所以需要取反码:
                               11111111 11111111 11111111 11110101
    然后根据反码取得原码:
                               10000000 00000000 00000000 00001010
    最终结果为-10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值