C/C++如何实现循环左移,循环右移

yizhihongxing

C/C++可以通过位操作实现循环左移和循环右移。

循环左移的思路是把数的二进制位向左移动k位,并把超出第n位的二进制位移到最低n位,最高位填0。

公式为:(x<>(n-k)&(pow(2,k)-1)<<n-k)

示例:

假设x的二进制表示为11001100, k=3

则循环左移3位后,二进制结果为01100110。

编写C/C++代码如下:

unsigned int rotate_left(unsigned int x, unsigned int k) {
    unsigned int n = sizeof(x) * 8;
    return (x << k) | (x >> (n-k) & (pow(2,k)-1) << (n-k));
}

循环右移的思路是把数的二进制位向右移动k位,并把超出第n位的二进制位移到最高n位,最低位填0。

公式为:(x>>k)|(x<<(n-k)&(pow(2,k)-1)<<n-k)

示例:

假设x的二进制表示为11001100, k=3

则循环右移3位后,二进制结果为10011001。

编写C/C++代码如下:

unsigned int rotate_right(unsigned int x, unsigned int k) {
    unsigned int n = sizeof(x) * 8;
    return (x >> k) | (x << (n-k) & (pow(2,k)-1) << (n-k));
}

以上代码中的sizeof(x) * 8就是获得一个整型数x的二进制位数,在32位环境下是32位,在64位环境下是64位。pow(2,k)-1表示得到k位二进制数,最高位为1,其余位为0。

总结起来,使用位运算可以快速实现循环左移和循环右移,效率非常高,是常见的数值处理操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++如何实现循环左移,循环右移 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Java异常处理try catch的基本用法

    下面是Java异常处理try catch的基本用法的攻略。 什么是异常 在Java程序运行时,如果遇到错误或不可预知的问题,程序就会抛出异常(Exception)。异常可以分为两种:受检异常和非受检异常。受检异常必须要用 try-catch 或者 throws 声明抛出异常,非受检异常则不需要。 try-catch基本语法 try-catch 语句由两个关键…

    C 2023年5月23日
    00
  • python中cPickle类使用方法详解

    下面我将详细讲解“python中cPickle类使用方法详解”的完整攻略。 1. 什么是cPickle cPickle是Python中的一个标准模块,它是pickle模块的C语言版本。它能够将Python对象序列化成一个二进制文件或字符串,使得它们可以在网络上以及在任何其他的Python程序中方便地传递和存储。 2. cPickle的主要用途 2.1 对象的…

    C 2023年5月22日
    00
  • C语言实现三子棋程序

    C语言实现三子棋程序的完整攻略如下所述: 1. 程序框架设计 首先需要设计程序的框架,包括定义所需变量,确定函数和主函数的执行顺序等。具体步骤如下: 1.1 定义变量 定义三个变量表示棋盘上的状态,分别用0,1,2表示,0表示空白位置,1表示玩家1落子,2表示玩家2落子。因此需要定义一个二维数组表示棋盘,再定义一个变量表示当前轮到哪个玩家。 1.2 定义函数…

    C 2023年5月23日
    00
  • C语言函数多个返回值方式

    C语言函数多个返回值方式 在C语言中,函数通常只能返回一个返回值。这可能会限制一些操作的实现,特别是在需要返回多个值的情况下。然而,C语言提供了多种方式来解决这个问题。 方式一:结构体 一种实现方式是通过使用结构体返回多个值。结构体通常定义了相​​关字段,而每个字段都可以看作是一个返回值。 typedef struct { int a; char b; fl…

    C 2023年5月23日
    00
  • JSON.parse 解析字符串出错的解决方法

    下面是针对 “JSON.parse 解析字符串出错的解决方法”的完整攻略: 1.问题背景 在开发web应用过程中,我们经常需要将 JavaScript 对象转为 JSON 字符串,然后再将 JSON 字符串解析为 JavaScript 对象。其中,JSON.parse() 这个解析方法是常用的一种。 然而,有时候使用 JSON.parse() 时会报错,比如…

    C 2023年5月23日
    00
  • Js的Array数组对象详解

    Js的Array数组对象详解 简介 在 JavaScript 中,Array 是一种重要的数据结构。简单来讲,数组就是一种存储一组数据的方式,这些数据可以是任意类型,包括数字、字符串、布尔值、对象等等。 而 Array 是一种对象,它是 JavaScript API 中自带的,具有一系列的方法和属性,可以方便地操作数组。 在本文中,我将详细介绍 Array …

    C 2023年5月23日
    00
  • ECMAScript6变量的解构赋值实例详解

    ECMAScript6变量的解构赋值实例详解 什么是解构赋值 解构赋值是ES6中的一个新特性,它允许你从数组或者对象中提取出数据并赋值到新的变量中。 数组解构赋值 let [a, b, c] = [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3 数组解构赋值中,…

    C 2023年5月23日
    00
  • C++实现扫雷、排雷小游戏

    C++实现扫雷、排雷小游戏攻略 游戏介绍 扫雷是一种单人益智游戏,目标是在一个方块网格中排雷,并尽可能快的完成游戏。游戏规则如下: 在一个大小为M * N的矩阵中,有一些地雷分布在矩阵中,其他方块是空白的 玩家可以翻开其中一个空白方块,如果该方块旁边有雷,则游戏失败,否则该方块会显示周围的雷数 如果翻开的方块周围没有雷,则该方块的周围的方块也会被翻开,直到所…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部