位运算 算法技巧

单位的换算:

ee42bdb7c4fb40079816bf4a852b0590.png


& -- 位与

| -- 位或

~--取反

^ 异或

<< 左移

>> 右移

774fbf05f7d44b75b8c9e237d796962d.png

十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f

十进制:0 1 2 3 4 5 6 7 8 9

八进制:0 1 2 3 4 5 6 7


十六进制转成二进制

0x   1   2     3   4    5    6     7     8

   0001 0010 0011 0100 0101 0110 0111 1000

八进制转成二进制

4    5    6

100 101 110

十进制转成二进制

10

1010

十进制负整数转换为二进制数:

例如:-29

第一步:先将该负整数对应的正整数转换为二进制数。

十进制数29的二进制数为00011101。

第二步:对得到的二进制数取反。

二进制数00011101取反为11100010。

第三步:加1。

11100010加1为11100011。

因此,十进制数-29转换为二进制数11100011。


补码如何应用?

例1:

假设两个四位二进制数0111和0110为无符号数,我们来计算一下两者之间的减法:0111-0110=7-6=1。

由于计算机没有减法运算,我们可以先求减数相对应的补数,四位二进制数的模为2^4=16,那么6的补数为16-6=10,也就是说7-6=7+10=17,0111-0110=0111+1010=10001。

因为只有4位,所以最高位省略,得到0001=1,正好是原本的计算结果。

例2:

假设两个四位二进制数0101和0011为无符号数,我们来计算一下两者之间的减法:0101-0011=5-3=2。

由于计算机没有减法运算,我们可以先求减数相对应的补数,四位二进制数的模为2^4=16,那么3的补数为16-3=13,也就是说5-3=5+13=18,0101-0011=0101+1101=10010。

因为只有4位,所以最高位省略,得到0010=2,正好是原本的计算结果。

特点:

1. 补码的符号可以看做是数值的一部分参与运算;

2. 在补码表示中,0只有一种表示方法;

3. 负数补码表示的范围比原码稍宽

首先,我们来看几个4位二进制数进行运算的例子!

在原码下,1-1=1+(-1)=0001+1001=1010=-2

我们可以看出,由于符号位参与计算,对于减法来说,用原码表示计算结果并不正确。

在反码下,1-1=1+(-1)=0001+1110=1111=-0

我们可以看出,用反码表示计算结果问题出现在“0”这个特殊数值上,正常来说,0不应该带符号,0带符号没有任何意义。

在补码下,1-1=1+(-1)=0001+1111=0000=0

我们可以看出,真值没有问题,0带符号的问题也解决了!

综上所述,我们使用补码的原因主要有以下两个方面:

第一,我们人脑可以知道原码的第一位是符号位,但是计算机不知道,而恰好补码表示中的符号位可以与数值位一起参加运算,弥补了计算机不能辨别符号位的缺憾。

第二,我们人脑可以快速计算减法,但是计算机很难做到,所以我们根据运算法则——减去一个正数等于加上一个负数,将减法运算转换成为加法运算,对计算机而言,这大大地简化了运算的过程。


位操作符

& 与运算 两个位都是1时,结果才为1,否则结果为0

  10011

& 11001

= 10001


| 或运算 两个位都是0时,结果才为0,否则结果为1

 10011

| 11001

= 11011


^ 异或运算 两个位相同则为0,不同则为1

 10011

^ 11001

=01010


~ 取反运算,1则变为0,0则变为1

 ~10011

= 01100


<< 左移

左移一位相当于*2

<<左移运算,向左进行移位操作,高位丢弃,低位补0

0000 0010=2

左移一位:0000 0100=4

左移三位:0001 0000=16

以32位机为例:

int a=8;

a<<3

移动前:0000 0000 0000 0000 0000 0000 0000 1000

移动后:0000 0000 0000 0000 0000 0000 0100 0000

>> 右移

右移一位相当于/2 

0000 0100=4

右移一位:0000 0010=2

右移三位:0000 0000=0

int a=8;

  1. >3

移动前:0000 0000 0000 0000 0000 0000 0000 1000

移动后:0000 0000 0000 0000 0000 0000 0000 0001


812df9adfeff4fd9959c9998aa7bd5dc.png

08fe99affe474ff0b9368c37104077a7.png


位运算小技巧

判断奇、偶数

核心:判断二进制最后一位是不是等于1,为1是奇数,为0是偶数

838003936b0243cc886be35b32413729.png

交换两个数

两个相同的数异或等于0,任何数和0异或等于它本身

异或运算满足交换律和结合律

a=5 b=8

14120bf191f846e7805bcfb3e84af651.png


例题:int a=3, b=6

c=a^b<<2; 

a=3=0011 b=6=0110

b<<2=0001 1000=24

a^b=0000 0011 ^ 0001 1000=0001 1011=27

 

将第七位置0

以32位机为例

x=   1111 1111 1111 1111 1111 1111 1111 1111

方法一:~(1<<7)&x

0000 0000 0000 0000 0000 0000 0000 0001<<7

= 0000 0000 0000 0000 0000 0000 1000 0000

方法二:~(1<<7)^x

 

= 1111 1111 1111 1111 1111 1111 0111 1111

 

将特定位置置位

x=0x12345678   将4-7位置0x3

(0xfffffff0=1111 1111 1111 1111 1111 1111 1111 0000

0xffffffff=1111 1111 1111 1111 1111 1111 1111 1111)

 

x&0xffffff0f=0001 0010 0011 0100 0101 0110 0000 1000

|      0x3<<4=0000 0000 0000 0000 0000 0000 0011 0000

=>0001 0010 0011 0100 0101 0110 0011 1000

先将特定位置0,再把准备替换的数对应上位置,最后或

26bf3de7d5ce4b83a1a91f7ab03c4d5d.png

取32bit无符号整数0x12345678的高16bit和低16bit,分别保存在两个16bit的无符号整数并显示出来。

7db9be897c954eefaeccdba136eee2ca.png


文件权限

读内容的权限        可读 r 4

写内容的权限        可写 w 2

执行的权限    可执行 x 1

d4cf4a3c9d084c2c8483388319b328e7.png

属主:所属的用户,文档所有者,这是一个账户,这是一个人

属组:所属的用户组,这是一个组。

7b5a1109c79745b0a0db18d3dd850bd8.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值