C语言置换位置问题
本帖最后由 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 不是二进制串吗,应该全部是 0 , 1 呀,哪里来的 2 , 4 , 8, a 等等,没听懂楼主的意思。 jackz007 发表于 2020-3-9 12:59
不是二进制串吗,应该全部是 0 , 1 呀,哪里来的 2 , 4 , 8, a 等等,没听懂楼主的意思。
64长的太难写了,我就写成16进制了,16转2就行了嘛 zhuby 发表于 2020-3-9 14:22
64长的太难写了,我就写成16进制了,16转2就行了嘛
2就是0010 本帖最后由 jackz007 于 2020-3-9 18:16 编辑
zhuby 发表于 2020-3-9 14:23
2就是0010
你的样例输入的是什么?如果是一个 64 位的整数,只需要一个数就行了,比如,2,它也可以是一个 64 位整数,如何需要那么一堆数字;如果是二进制数,那得是 64 个 0 和 1 才对,完全看不懂你的样例。 看不懂你的样例输入和输出,但是大概猜得到你的需求
为什么要用二进制输入?下面这个程序是使用十进制输入的,如果你需要二进制输入,那就自行修改代码,把这个代码修改成二进制输入的
#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 = {
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));
}
printf("%lx\n", new_data);
return 0;
}
jackz007 发表于 2020-3-9 18:13
你的样例输入的是什么?如果是一个 64 位的整数,只需要一个数就行了,比如,2,它也可以是一个...
是我偷懒了,已经修改了 本帖最后由 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>
页:
[1]