鱼C论坛

 找回密码
 立即注册
查看: 1105|回复: 7

[已解决]C语言置换位置问题

[复制链接]
发表于 2020-3-9 12:20:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhuby 于 2020-3-9 21:26 编辑

有一个长为64的 0、1bit串,按照下面规则置换输出:
{
        0,16,32,48,1,17,33,49,2,18,34,50,3,19,35,51,
        4,20,36,52,5,21,37,53,6,22,38,54,7,23,39,55,
    8,24,40,56,9,25,41,57,10,26,42,58,11,27,43,59,
        12,28,44,60,13,29,45,61,14,30,46,62,15,31,47,63};//即新的bit串第1位是原来的1位,第2位是原来的16位。
输入样例:0010000000001010000000001011000000000000011000000000000000000000
输出结果:0000000010000000000000000000000001000010011001001000000010000000
最佳答案
2020-3-10 00:12:14
本帖最后由 jackz007 于 2020-3-10 02:10 编辑
#include <stdio.h>

void binshow(unsigned long long n)
{
        for(int k = 0 ; k < 64 ; k ++) printf("%d" , (n >> (63 - k)) & 1LL) ;
        printf("\n")                                                        ;
}

unsigned long long transform(unsigned long long n)
{
        unsigned long long d = 0                                                                   ;
        int i , j , k = 0                                                                          ;
        for(i = 0 ; i < 16 ; i ++) for(j = i ; j < 64 ; k ++ , j += 16) d |= ((n >> j) & 1LL) << k ;
        return d                                                                                   ;
}

main(void)
{
        unsigned long long c , d   ;
        c = 0x200a00b000600000     ;
        d = transform(c)           ;
        printf("0x%016I64x\n" , c) ;
        printf("0x%016I64x\n" , d) ;
        binshow(c)                 ;
        binshow(d)                 ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
0x200a00b000600000
0x0080000042648080
0010000000001010000000001011000000000000011000000000000000000000
0000000010000000000000000000000001000010011001001000000010000000

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

使用道具 举报

发表于 2020-3-9 12:59:10 | 显示全部楼层
       不是二进制串吗,应该全部是 0 , 1 呀,哪里来的 2 , 4 , 8  , a 等等,没听懂楼主的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-9 14:22:24 | 显示全部楼层
jackz007 发表于 2020-3-9 12:59
不是二进制串吗,应该全部是 0 , 1 呀,哪里来的 2 , 4 , 8  , a 等等,没听懂楼主的意思。

64长的太难写了,我就写成16进制了,16转2就行了嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-9 14:23:23 | 显示全部楼层
zhuby 发表于 2020-3-9 14:22
64长的太难写了,我就写成16进制了,16转2就行了嘛

2就是0010
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 18:13:15 | 显示全部楼层
本帖最后由 jackz007 于 2020-3-9 18:16 编辑


      你的样例输入的是什么?如果是一个 64 位的整数,只需要一个数就行了,比如,2,它也可以是一个 64 位整数,如何需要那么一堆数字;如果是二进制数,那得是 64 个 0 和 1 才对,完全看不懂你的样例。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-9 21:02:52 | 显示全部楼层
看不懂你的样例输入和输出,但是大概猜得到你的需求
为什么要用二进制输入?下面这个程序是使用十进制输入的,如果你需要二进制输入,那就自行修改代码,把这个代码修改成二进制输入的

1.png
#include <stdio.h>
#include <stdint.h>

void set_bit(uint64_t *data, uint8_t index, uint8_t val)
{
    if(index >= 64) return;
    *data &= ~((uint64_t)1 << index);
    val = val ? 1 : val;
    *data |= (uint64_t)val << index;
}

uint8_t get_bit(uint64_t data, uint8_t index)
{
    if(index >= 64) return -1;
    return (data & ((uint64_t)1 << index)) ? 1 : 0;
}

int main(void)
{
    uint8_t transform[64] = {
         0, 16, 32, 48,  1, 17, 33, 49,  2, 18, 34, 50,  3, 19, 35, 51,
         4, 20, 36, 52,  5, 21, 37, 53,  6, 22, 38, 54,  7, 23, 39, 55,
         8, 24, 40, 56,  9, 25, 41, 57, 10, 26, 42, 58, 11, 27, 43, 59,
        12, 28, 44, 60, 13, 29, 45, 61, 14, 30, 46, 62, 15, 31, 47, 63
    };
    uint64_t data;
    uint64_t new_data = 0;
    printf("请输入一个数: ");
    scanf("%lu", &data);
    for(size_t i = 0; i < 64; ++i) {
        set_bit(&new_data, i, get_bit(data, transform[i]));
    }
    printf("%lx\n", new_data);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-9 21:26:59 | 显示全部楼层
jackz007 发表于 2020-3-9 18:13
你的样例输入的是什么?如果是一个 64 位的整数,只需要一个数就行了,比如,2,它也可以是一个  ...

是我偷懒了,已经修改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 00:12:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-10 02:10 编辑
#include <stdio.h>

void binshow(unsigned long long n)
{
        for(int k = 0 ; k < 64 ; k ++) printf("%d" , (n >> (63 - k)) & 1LL) ;
        printf("\n")                                                        ;
}

unsigned long long transform(unsigned long long n)
{
        unsigned long long d = 0                                                                   ;
        int i , j , k = 0                                                                          ;
        for(i = 0 ; i < 16 ; i ++) for(j = i ; j < 64 ; k ++ , j += 16) d |= ((n >> j) & 1LL) << k ;
        return d                                                                                   ;
}

main(void)
{
        unsigned long long c , d   ;
        c = 0x200a00b000600000     ;
        d = transform(c)           ;
        printf("0x%016I64x\n" , c) ;
        printf("0x%016I64x\n" , d) ;
        binshow(c)                 ;
        binshow(d)                 ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
0x200a00b000600000
0x0080000042648080
0010000000001010000000001011000000000000011000000000000000000000
0000000010000000000000000000000001000010011001001000000010000000

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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