位运算规则【算法通关村十一关(1)】

一、数字在计算机中表示

计算机中的数字全部用机器数表示,也就是二进制运算。
机器数由8位组成,第一位符号位
机器数对应的真值就是原本的数。例如00000001 = +1


其中机器数分为原码、反码、补码
原码:机器数原本的值,第一位符号位,其余位值。

[+1]= 0000 0001
[-1]= 1000 0001

反码:正数反码为它本身;负数的反码在原码基础上符号位不变,其余位取反

[+1]= 0000 0001 = 0000 0001[-1]= 1000 0001 = 1111 1110

补码:正数补码为它本身;负数的补码在原码基础上符号位不变,其余位取反+1

[+1]= 0000 0001 = 0000 0001= 0000 0001
[-1]= 1000 0001 = 1111 1110= 1111 1111

二、2位运算规则

位运算主要有:与、或、异或、取反、左移和右移,其中左移和右移统称移位运算,移位运算又分为算术移位和逻辑移位。

2.1 与、或、异或、取反

与运算:&
有一个为1则结果为1,否则0
或运算:|
两个都为0则结果为0,否则1
异或:^
同出0,异出1
取反:~
0变1,1变0

2.2 移位运算

左移:<<相当于乘以2,二进制向左移动,高位丢弃,低位补0;
右移:>>相当于除以2,二进制位向右移动,低位丢弃;高位由算数或逻辑移位决定:

  • 算数右移,高位补最高位;
  • 逻辑右移时,高位补0

C/C++:有符号用signed声明,无符号用unsigned声明,默认有符号;有符号右移为算数右移,无符号为逻辑右移
java:所有都是有符号类型,因此算数右移为>> ,逻辑右移为>>>

一个数左移k位,相当于乘以2k;一个数右移k位,相当于除以2k;

2.3 常用技巧

幂等律:a&a=a,a|a=a(注意异或不满足幂等律):
交换律:a&b=b&a,a|b=b|a,a⊕b=b⊕a;
结合律:(a&b)&c=a&(b&c),(a|b)|c=a|(b|c),
(a⊕b)⊕c=a⊕(b⊕c)
分配律:(a&b)|c=(a|c)&(b|c),(a|b)&c=(a&c)|(b&c),
(a⊕b)&c=(a&c)⊕(b&c);
德摩根律:~(a&b)=(~a)|(~b),~(a|b)=(~a)&(~b):
取反运算性质:-1=~0,-a=~(a-1):
与运算性质:a&0=0,a&(-1)=a,a&(~a)=0:
或运算性质:a | 0 = a;
异或运算性质:a⊕0=a,a⊕a=0:

你可能感兴趣的:(算法通关村第一期,算法,算法)