基础知识:
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,将结果再移动到最低位。

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个
【代码】先求1~n-1连续的异或

【算法2】若题目没有不能开辅助空间的约束时,可以开一个辅助空间,辅助数组下标对应数值,记录数字出现的次数。
2.找出落单的那个数
【问题描述】一个数组里除了某一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。
【算法】与上一题相似,出现2次的就被异或掉了。好补或者是知道范围的可以用异或的方法,其他的可以用数组下标法。
3.二进制中1的个数
【问题描述】请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例:9的二进制表示为1001,有2位是1
【算法1】探测某一位是不是1的方法上图所画方法,&运算完成之后正好等于1移位过去的数值
【代码】

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

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

=0是终止条件
【代码】

5.用一条语句判断一个整数是不是2的整数次方
【算法】是2的整数次方=2进制表示中只有1个1
if (((n-1)&n)==0)
是2的整数次方;
6.将整数的奇偶位互换
【算法】&运算特点:与1&保留,与0&消除

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

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

8.出现K次与出现一次
【问题描述】数组中只有一个数出现了1次,其他数都出现了K次,请输出只出现了一次的数
【算法】2个2进制数做不进位相加=0;10个10进制数不进位相加=0;K个K进制数不进位相加=0
Integer.toString(i,radix) ; 10进制转radix进制
【代码】

本文介绍了位运算的基础知识,包括与(&)、或(|)、异或(^)、左移(<<)、右移(>>)等操作,并探讨了它们在判断奇偶数、交换变量、求绝对值等方面的应用。通过异或操作解决实际编程问题,如找到数组中唯一重复或单独出现的数字,计算二进制中1的个数,以及判断是否为2的整数次方。
1018

被折叠的 条评论
为什么被折叠?



