鱼C论坛

 找回密码
 立即注册
查看: 1390|回复: 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 编辑
  1. #include <stdio.h>

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

  7. unsigned long long transform(unsigned long long n)
  8. {
  9.         unsigned long long d = 0                                                                   ;
  10.         int i , j , k = 0                                                                          ;
  11.         for(i = 0 ; i < 16 ; i ++) for(j = i ; j < 64 ; k ++ , j += 16) d |= ((n >> j) & 1LL) << k ;
  12.         return d                                                                                   ;
  13. }

  14. main(void)
  15. {
  16.         unsigned long long c , d   ;
  17.         c = 0x200a00b000600000     ;
  18.         d = transform(c)           ;
  19.         printf("0x%016I64x\n" , c) ;
  20.         printf("0x%016I64x\n" , d) ;
  21.         binshow(c)                 ;
  22.         binshow(d)                 ;
  23. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 0x200a00b000600000
  4. 0x0080000042648080
  5. 0010000000001010000000001011000000000000011000000000000000000000
  6. 0000000010000000000000000000000001000010011001001000000010000000

  7. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 12:59:10 | 显示全部楼层
       不是二进制串吗,应该全部是 0 , 1 呀,哪里来的 2 , 4 , 8  , a 等等,没听懂楼主的意思。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

64长的太难写了,我就写成16进制了,16转2就行了嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

2就是0010
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

1.png

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

  3. void set_bit(uint64_t *data, uint8_t index, uint8_t val)
  4. {
  5.     if(index >= 64) return;
  6.     *data &= ~((uint64_t)1 << index);
  7.     val = val ? 1 : val;
  8.     *data |= (uint64_t)val << index;
  9. }

  10. uint8_t get_bit(uint64_t data, uint8_t index)
  11. {
  12.     if(index >= 64) return -1;
  13.     return (data & ((uint64_t)1 << index)) ? 1 : 0;
  14. }

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

使用道具 举报

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

是我偷懒了,已经修改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  7. unsigned long long transform(unsigned long long n)
  8. {
  9.         unsigned long long d = 0                                                                   ;
  10.         int i , j , k = 0                                                                          ;
  11.         for(i = 0 ; i < 16 ; i ++) for(j = i ; j < 64 ; k ++ , j += 16) d |= ((n >> j) & 1LL) << k ;
  12.         return d                                                                                   ;
  13. }

  14. main(void)
  15. {
  16.         unsigned long long c , d   ;
  17.         c = 0x200a00b000600000     ;
  18.         d = transform(c)           ;
  19.         printf("0x%016I64x\n" , c) ;
  20.         printf("0x%016I64x\n" , d) ;
  21.         binshow(c)                 ;
  22.         binshow(d)                 ;
  23. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 0x200a00b000600000
  4. 0x0080000042648080
  5. 0010000000001010000000001011000000000000011000000000000000000000
  6. 0000000010000000000000000000000001000010011001001000000010000000

  7. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 10:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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