在c语言中1<<i与i<<1的区别,力扣191题

本文详细解析位运算符<<,包括其实现原理,如何用它实现快速乘2和位掩码操作,并通过实例演示左移赋值运算。重点讲解左移在编程中的关键应用和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1<<i :是将1左移i位,即第i位为1,其余位为0;

左移一位相当于对该数乘2,左移n位就相当于乘n个2。

如果n第i位为0,则n&(1<<i)的值为0,如果n第i位为1,则n&(1<<i)的值为1。

i<<1:

左移赋值运算。 变量i 左移1位, 结果仍然保存到变量i。

### 力扣第566目概述 力扣第566名为 **Reshape the Matrix**,其核心问是给定一个二维矩阵 `nums` 和两个正整数 `r` 和 `c`,判断是否可以将原矩阵重塑为大小为 `r x c` 的新矩阵。如果可能,则返回新的矩阵;否则返回原始矩阵。 以下是基于此问的C语言解决方案: --- ### 解决方案分析 #### 方法描述 为了完成该任务,需遵循以下逻辑流程: 1. 验证输入条件:计算原矩阵中的总元素数量,并确认它等于目标矩阵所需的元素总数 (`m * n == r * c`)。 2. 如果验证失败,则直接返回原始矩阵。 3. 若满足条件,则通过遍历的方式重新分配数据到目标矩阵中。 时间复杂度为 \(O(m \times n)\),空间复杂度取决于实现方式,通常为 \(O(r \times c)\)[^1]。 --- ### C语言代码实现 下面是完整的C语言解法: ```c #include <stdio.h> #include <stdlib.h> int** matrixReshape(int** nums, int numsSize, int* numsColSize, int r, int c, int* returnSize, int** returnColumnSizes){ int m = numsSize; int n = numsColSize[0]; // 判断是否能重塑矩阵 if (m * n != r * c) { *returnSize = numsSize; *returnColumnSizes = numsColSize; return nums; } // 初始化返回矩阵 int** result = (int**)malloc(sizeof(int*) * r); *returnColumnSizes = (int*)malloc(sizeof(int) * r); for (int i = 0; i < r; ++i) { (*returnColumnSizes)[i] = c; result[i] = (int*)malloc(sizeof(int) * c); } *returnSize = r; // 填充结果矩阵 for (int i = 0; i < m * n; ++i) { result[i / c][i % c] = nums[i / n][i % n]; } return result; } ``` 上述代码实现了矩阵重塑功能,具体说明如下: - 输入参数包括原始矩阵及其尺寸、目标行数和列数。 - 输出为目标矩阵以及对应的行列信息。 - 使用一维索引映射至二维坐标来填充新矩阵[^1]。 --- ### 注意事项 在实际应用过程中需要注意边界情况处理,例如当无法重塑时应正确返回原始矩阵而不改变任何结构。 --- 相关问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值