移位运算符的小技巧

简介: 快速学习移位运算符的小技巧

移位符号

 * >>右移,补码移动,表示向右移动几位,正数高位补0,负数高位补1
 * <<左移,补码移动,无正负
 * >>>无符号右移,右移后高位补0,无正负

(1).判断二进制中1的个数

思路:

1.利用进制转的规则写出来算法

2.利用位运算,1,二进制只有一个1,不断移动二进制中一位置,然后做按位与,只有1&1=1,判断结果是否为0,即可

3.法2反向思考,挪动要判断的数字,然后与1做与运算

4.例如9=1001,8=1000,7=0111,9&8=8=1000,可以去掉一个1,8*7=0000,又去掉一个1

5.java可以利用封装的方法 Integer.bitCount( )

package 位运算;
import java.util.Scanner;
public class 二进制中1的个数 {
  public static void main(String[] args) {
    /*
     * 思路一:利用进制转换法写出算法,判断
     */
      int n=9;
      int m,k=0;
      while(n>0) {
      m=n%2;
      if(m==1)k++;
      n/=2;
      }
      System.out.println(k);
      System.out.println("==");
    /*
     * 思路二:利用位运算,当1向左移动是,利用与运算,只有1&1=1,判断这一位是否有1
     */
    int k1=0;
    for(int i=0;i<32;i++) {
      if(((1<<i)&9)!=0) 
        k1++;
    }
    System.out.println(k1);
    System.out.println("===");
    /*
     * 思路三:不挪动1,挪动n,在判断
     */
    int k2=0;
    for(int i=0;i<32;i++) {
      if(((9>>i)&1)!=0) 
        k2++; 
    }
    System.out.println(k2);
    System.out.println("====");
    /*
     * 思路四:9=1001.8=1000;9&8=8=1000;去掉一个1了,最后判断减去多少个1
     */
    int N=9,k3=0;
    while(N!=0) {
      N&=(N-1);
      k3++;
    }
    System.out.println(k2);
    System.out.println("=====");
    /*
     * 思路四:利用封装的方法
     */
    System.out.println(Integer.bitCount(9));
    System.out.println("======");
  }
}

(二)二进制中奇偶数字互换

思路:

利用位运算把奇数和偶数上的数字截取出来,比如9=1001,截取j,偶数位x=1000,奇数位y=0001,在分别移动位置,x右移,y左移,得到,0100,0010,然后按位或或者相加,得到0110

package 位运算;
import java.util.Scanner;
/*
   * 思路一:
   *    把二进制放进数组中,然后遍历数组,两两交换,
   * 与运算
   * 1叫做保留,0是消除
   */
public class 二进制奇偶互换 {
  public static void main(String[] args) {
    /*
     * 思路:保留奇数位和偶数位的二进制数字,然后分别将其移动,偶数位左移,奇数位右移,然后相加
     */
    Scanner sc=new Scanner(System.in);
    int N=sc.nextInt();
    int j1=N&0Xaaaaaaaa;//偶数位,jdk中允许16进制的书写,而且int型为32位,比较的二进制,写的哪一进制没有问题
    int j2=N&0x55555555;//奇数位
    System.out.println((j1>>1)^(j2<<1));
    /*
     * 1.可以相加
     * 2.按位或
     * 3.按位异或
     */
  }
}
相关文章
|
1月前
【编程基础知识】正数负数的二进制位运算(左移 右移 无符号右移)
正数和负数需转换成二进制后进行移位运算。左移低位补0,不影响符号位;右移符号位跟随移动,最高位还原为原符号位;无符号右移高位补0,适用于负数处理。
73 0
|
6月前
|
存储
算数移位,逻辑移位以及循环移位
算数移位,逻辑移位以及循环移位
103 0
按位操作符:按位与 & 、按位或 | 、按位异或 ^ 、按位取反 ~
所有的按位操作符都是按二进制位补码操作
69 0
|
C语言
C/运算符(按位与、按位或、按位异或)
C/运算符(按位与、按位或、按位异或)
|
存储
5.2.5_定点数的移位运算
计算机组成原理之定点数的移位运算
321 0
5.2.5_定点数的移位运算
位运算中的按位与(&),按位或(|),按位异或(^)
位运算中的按位与(&),按位或(|),按位异或(^)
128 0
位运算中的按位与(&),按位或(|),按位异或(^)
(位操作符)按位与、按位或、按位异或
(位操作符)按位与、按位或、按位异或
(位操作符)按位与、按位或、按位异或
有符号右移>>,无符号右移>>>
有符号右移>>,无符号右移>>>
130 0