CaptainBiken 发表于 2023-8-29 18:27:01

C++数据结构与语法相关

本帖最后由 CaptainBiken 于 2023-8-29 18:34 编辑

请问C/C++如何对位进行操作?
总的目标是取1000000个长整数的最后一bit并按序存储到文件中
补充:最后生成的文件应该为1000000bit而不是1000000byte,也就是说生成的文件中每一个bit都来自长整数,而不是存在若干个占位的0

isdkz 发表于 2023-8-29 18:27:56

在C/C++中,可以使用位运算符对位进行操作。对于你的目标,可以使用位运算符来获取长整数的最后一位,并将其按顺序存储到文件中。

首先,我们需要了解两个位运算符:位与运算符(&)和右移运算符(>>)。

位与运算符(&)用于将两个操作数的对应位进行与操作。对于一个长整数(比如unsigned long long类型),可以使用位与运算符与1进行与操作来获取最后一位的值。例如:

unsigned long long number = 123456789; // 假设这是一个长整数
unsigned long long lastBit = number & 1; // 获取最后一位的值


右移运算符(>>)用于将一个操作数的所有位向右移动指定的位数。对于一个长整数,可以使用右移运算符将其向右移动1位,然后再进行与操作来获取最后一位的值。例如:

unsigned long long number = 123456789; // 假设这是一个长整数
unsigned long long lastBit = (number >> 1) & 1; // 获取最后一位的值


接下来,你可以使用循环来处理1000000个长整数,并将每个长整数的最后一位按顺序存储到文件中。具体的代码如下所示:

#include <iostream>
#include <fstream>

int main() {
    std::ofstream outputFile("output.txt"); // 打开输出文件

    for (unsigned long long i = 0; i < 1000000; i++) {
      unsigned long long number = /* 从某处获取长整数 */;
      unsigned long long lastBit = (number >> 1) & 1; // 获取最后一位的值

      outputFile << lastBit; // 将最后一位写入文件
    }

    outputFile.close(); // 关闭输出文件

    return 0;
}


请注意,上述代码中的 /* 从某处获取长整数 */ 是一个占位符,你需要根据实际情况从某处获取长整数的值。

希望这能帮助到你!如果你还有其他问题,请随时提问。

ba21 发表于 2023-8-29 18:30:28

在C/C++中,你可以使用位运算操作符对位进行操作。要取长整数的最后一位(即最低有效位),可以使用按位与运算符(&)和位掩码。

下面是一个示例代码,展示如何取1000000个长整数的最后一位并按序存储到文件中:

#include <iostream>
#include <fstream>

// 用于生成位掩码的宏定义
#define BIT_MASK 0x01

int main() {
    // 创建一个存储结果的文件
    std::ofstream file("output.txt");

    // 定义长整数数组
    long int numbers = { /* Initialize your numbers here */ };

    // 遍历数组并取最后一位写入文件
    for (int i = 0; i < 1000000; ++i) {
      // 取最后一位
      int lastBit = numbers & BIT_MASK;

      // 将结果写入文件
      file << lastBit;
    }

    // 关闭文件
    file.close();

    return 0;
}
上述代码中,我们使用了一个宏定义 BIT_MASK 来表示只保留最后一位的位掩码(即二进制的 0x01)。然后,我们遍历长整数数组,将每个数与位掩码进行按位与运算,以提取最后一位。最后,将每个最后一位写入文件中。

请根据你的实际需求修改示例代码中的 numbers 数组的初始化部分,并将结果写入你希望保存的文件中。

额外减小 发表于 2023-8-29 18:40:33

ba21 发表于 2023-8-29 18:30
在C/C++中,你可以使用位运算操作符对位进行操作。要取长整数的最后一位(即最低有效位),可以使用按位与 ...

啊?
你怎么也用GPT了?

柿子饼同学 发表于 2023-8-29 18:41:16

本帖最后由 柿子饼同学 于 2023-8-29 18:44 编辑

整数是用 二进制 存储的 , 找出最后一位 , 可以用位运算
num & 1 的意思就是取出最后一位 , 下面是一个例子

00100010010101 --> num
00000000000001 --> 1
&
______________________
00000000000001
可以发现最后 & 1 的结果和这个数最后一位有关
如果这个数最后一位是 1 , 那& 1 后结果就是 1
反之为 0
#include <bits/stdc++.h>
using namespace std;

long long num;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
   
    freopen("INPUT.txt", "r", stdin);
    freopen("OUTPUT.txt", "w", stdout);

    for(int i = 1; i <= 1000000; i++){
      cin >> num;
      cout << (num & 1);
    }
   
    return 0;
}

ba21 发表于 2023-8-29 18:59:19

额外减小 发表于 2023-8-29 18:40
啊?
你怎么也用GPT了?

这点我就不赞同了。
我是人工加GTP,必经人家GPT刷都正常,我在GPT的基础上加上人工判断,给出正确合理的解答,除非你找出解答中有不合理的地方。

额外减小 发表于 2023-8-29 19:20:00

ba21 发表于 2023-8-29 18:59
这点我就不赞同了。
我是人工加GTP,必经人家GPT刷都正常,我在GPT的基础上加上人工判断,给出正确合理 ...

6
那挺好的
支持一下

ba21 发表于 2023-8-29 19:49:03

额外减小 发表于 2023-8-29 19:20
6
那挺好的
支持一下

{:5_109:}其实还是为了刷分。偷懒了

CaptainBiken 发表于 2023-8-30 09:02:17

通过其他途径问题已解决,上述回答我也不知道哪个好,最佳答案版主帮忙给一个吧{:5_92:}
页: [1]
查看完整版本: C++数据结构与语法相关