C/Java 实现循环移位

算法实现

  • 循环右移:数字 >>> 移动位数 | 数字 << (数字类型占用的空间 - 移动位数)

  • 循环左移:数字 << 移动位数 | 数字 >>> (数字类型占用的空间 - 移动位数)

    >>>是无符号右移运算符,C语言中不存在这个运算符,只能用>>代替

C语言

#include<stdio.h>

//CRO_TYPE必须是无符号整型
typedef unsigned int CRO_TYPE;

CRO_TYPE cror(CRO_TYPE, int);
CRO_TYPE crol(CRO_TYPE, int);

void main()
{
	printf("%d\n", cror(6, 8));
	printf("%d\n", crol(100663296, 8));
}

/**
 *@param num 要移动的数字  
 *@param shift 要移动的位数
*/
CRO_TYPE cror(CRO_TYPE num, int shift)
{
	if(shift < 0) return 0;
	int size = sizeof(CRO_TYPE) * 8;
	shift %= size;
	return num >> (shift) | num << (size - shift);
}


/**
 *@param num 要移动的数字  
 *@param shift 要移动的位数
*/
CRO_TYPE crol(CRO_TYPE num, int shift)
{
	if(shift < 0) return 0;
	int size = sizeof(CRO_TYPE) * 8;
	shift %= size;
	return num << (shift) | num >> (size - shift);
}


Java语言

public class ShiftUtil {

    /**
     *@param num 要移动的数字
     *@param shift 要移动的位数
     */
    public static int crorInt(int num, int shift){
        if(shift < 0)
            return 0;
        shift %= 32;
        return num >>> (shift) | num << (32 - shift);
    }

    /**
     *@param num 要移动的数字
     *@param shift 要移动的位数
     */
    public static long crorLong(long num, int shift){
        if(shift < 0)
            return 0;
        shift %= 64;
        return num >>> (shift) | num << (64 - shift);
    }

    /**
     *@param num 要移动的数字
     *@param shift 要移动的位数
     */
    public static int crolInt(int num, int shift){
        if(shift < 0)
            return 0;
        shift %= 32;
        return num << (shift) | num >>> (32 - shift);
    }

    /**
     *@param num 要移动的数字
     *@param shift 要移动的位数
     */
    public static long crolLong(long num, int shift){
        if(shift < 0)
            return 0;
        shift %= 64;
        return num << (shift) | num >>> (64 - shift);
    }

}

使用

public class Main {
    public static void main (String[] args){
        System.out.println(ShiftUtil.crorInt(6, 8));
        System.out.println(ShiftUtil.crolInt(100663296, 8) );
    }
}
原创文章 10 获赞 11 访问量 1067

猜你喜欢

转载自blog.csdn.net/qq_34802028/article/details/106153750