算法实现
-
循环右移:数字 >>> 移动位数 | 数字 << (数字类型占用的空间 - 移动位数)
-
循环左移:数字 << 移动位数 | 数字 >>> (数字类型占用的空间 - 移动位数)
>>>是无符号右移运算符,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) );
}
}