鱼C论坛

 找回密码
 立即注册
查看: 1574|回复: 8

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

[复制链接]
发表于 2023-8-29 18:27:01 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 CaptainBiken 于 2023-8-29 18:34 编辑

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}

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

希望这能帮助到你!如果你还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[1000000] = { /* Initialize your numbers here */ };

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

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

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

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

请根据你的实际需求修改示例代码中的 numbers 数组的初始化部分,并将结果写入你希望保存的文件中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

啊?
你怎么也用GPT了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-29 18:59:19 | 显示全部楼层
额外减小 发表于 2023-8-29 18:40
啊?
你怎么也用GPT了?

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

评分

参与人数 1鱼币 +2 收起 理由
额外减小 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

6
那挺好的
支持一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-29 19:49:03 | 显示全部楼层
额外减小 发表于 2023-8-29 19:20
6
那挺好的
支持一下

其实还是为了刷分。偷懒了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-30 09:02:17 | 显示全部楼层
通过其他途径问题已解决,上述回答我也不知道哪个好,最佳答案版主帮忙给一个吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表