蓝桥杯:位运算
一 位运算的功能
1,可进行判断奇偶数
对于y=x&1,如果x为偶数,则x的二进制的最后一位是1,此时,y的值是1,如果x是奇数,则其二进制的最后一位是0,y的值是0;
2,获取二进制位是1还是0
java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
package com.lanqiao;
public class Binary {
public static void main(String[] args)
{
int num = 19;
String binaryString = Integer.toBinaryString(num);
System.out.println(binaryString);
for (int i = 0; i < binaryString.getBytes().length; i++)
{
System.out.print(get(num, i) + "\t");
}
}
/**
* @param num:要获取二进制值的数
* @param index:倒数第一位为0,依次类推
*/
public static int get(int num, int index)
{
return (num & (0x1 << index)) >> index;
}
}
3.变换两个整数变量的值
4,不用判断语句,求整数的绝对值
对于异或运算:数值之间的异或运算就是二进制之间的运算
异或运算实例
实例2:
求二进制中1的个数
源码为
package com.lanqiao;
import java.util.Scanner;
/**
* 求二进制中1的个数
*/
public class Binary2 {
public static void main(String args[])
{
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
System.out.println(Integer.toString(n,2));
//方法一:将000001中的1不断向左移位并与n相&,思想是每移动一位,就可以确定n的该位是不是1,
int count=0;
//比对每一位
for(int i=0;i<32;i++)
{
if((n&(1<<i))==(1<<i))
{
count++;
}
}
System.out.println(count);
//方法二:让n本身向右移位,从0位开始移动,再与1相&,如结果为1,则说明最后一位是1。
count=0;
for(int i=0;i<32;i++)
{
if(((n>>>i)&1)==1)
{
count++;
}
}
System.out.println(count);
//方法三:二进制数每减一,再和该二进制相&,结果就会使原二进制数少一个低位的1,直到去掉所有的1,记下去的次数、
//就是二进制数中1的个数
count=0;
while (n!=0)
{
n=(n-1)&n;
count++;
}
System.out.println(count);
}
}
扩展:
如果询问:如何用一条语句判断一个数是不是2的整数次方?
思路:如果二进制位上只有一个1,则这个数就是二的整数次方
解法是利用上个问题的第三种解法
if((n&(n-1)==0)