位运算(&、|、^)

基础知识:

 

1.在处理整型数值时,可以直接对数值的各个位进行操作,即可用屏蔽技术获得整数中的各个位

2.&(与:都为1结果才为1)、|(或:有一个为1结果为1)、^(异或:二者不同时结果为1)、~(非)

3.>>(右移)、<<(左移)将二进制位进行右移或左移操作

4.>>>用0填充高位,>>用符号位填充高位,没有<<<运算符

5.对于int型,1<<35与1<<3相同(取模),左侧操作数是long型时需对右侧作模64


应用: 

1.判断奇偶数

if (x&1)==1  x为奇数; 
if (x&1)==0  x为偶数;

因为偶数的最后一位是0,奇数的最后一位是1

2.获取二进制位是1还是0

将1左移到那个位上,其他位都是0,作&运算就相当于把其他位屏蔽掉,因为0与任何数作&都是0,将结果再移动到最低位。

位运算(&、|、^)_第1张图片

3.交换两个整数变量的值

4.不用判断语句,求整数的绝对值

5.异或,可以理解为不进位加法: 1+1=0   0+0=0   1+0=1


题目:

1.唯一成对的数

【问题描述】1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间。

【算法1】异或(^)消除偶数个出现次数的字母   A^A=0   B^0=B   A^A^B^C^C=B

1……K K……1000 ^(1 ^……K……1000)这样K就有3个

【代码】

位运算(&、|、^)_第2张图片

【算法2】若题目没有不能开辅助空间的约束时,可以开一个辅助空间,辅助数组下标对应数值,记录数字出现的次数。

2.找出落单的那个数

【问题描述】一个数组里除了某一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。

【算法】与上一题相似,出现2次的就被异或掉了。好补或者是知道范围的可以用异或的方法,其他的可以用数组下标法。

3.二进制中1的个数

【问题描述】请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例:9的二进制表示为1001,有2位是1

【算法1】探测某一位是不是1的方法上图所画方法,&运算完成之后正好等于1移位过去的数值

【代码】

位运算(&、|、^)_第3张图片

【算法2】将n右移,与1&,1不动

【代码】

位运算(&、|、^)_第4张图片

【算法3】(x-1)&x的效果是消掉n末尾的1

位运算(&、|、^)_第5张图片

 =0是终止条件

【代码】

位运算(&、|、^)_第6张图片

 5.用一条语句判断一个整数是不是2的整数次方

【算法】是2的整数次方=2进制表示中只有1个1

if  (((n-1)&n)==0) 
    是2的整数次方;

6.将整数的奇偶位互换

 【算法】&运算特点:与1&保留,与0&消除

 分别保留奇偶位,再将结果 ^ 

位运算(&、|、^)_第7张图片

 每4位2进制可以用16进制表示

7.0-1间浮点实数的二进制表示

【问题描述】给定一个介于0和1之间的实数,(如0.625),类型为double,打印他的二进制表示(0.101,因为小数点后的二进制分别表示0.5、0.25、0.125……)。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”

【算法】浮点数×2的方式看个位

【代码】

位运算(&、|、^)_第8张图片

 8.出现K次与出现一次

【问题描述】数组中只有一个数出现了1次,其他数都出现了K次,请输出只出现了一次的数

【算法】2个2进制数做不进位相加=0;10个10进制数不进位相加=0;K个K进制数不进位相加=0

Integer.toString(i,radix) ; 10进制转radix进制

【代码】

位运算(&、|、^)_第9张图片

你可能感兴趣的:(算法java,java,算法)