找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1161|回复: 9
收起左侧

4位数如何做可以让它的排列方向倒过来?

[复制链接]
ID:965189 发表于 2026-1-31 00:17 来自触屏版 | 显示全部楼层 |阅读模式
4位数如何做可以让它的排列方向倒过来。如:1011,把它排成:1101。从1到15。每个数都倒排位置。
回复

使用道具 举报

ID:1064915 发表于 2026-2-1 08:17 | 显示全部楼层
数分词成char,for倒序,strtod
回复

使用道具 举报

ID:1133081 发表于 2026-2-1 09:59 | 显示全部楼层
把这个代码稍改一下即可
unsigned char Conversion(unsigned char dat)
{
    unsigned char i,temp;
    for(i=0;i<8;i++)
    {
        temp <<= 1;
        temp += dat & 0x01;
        dat >>= 1;
    }
    return temp;
}
回复

使用道具 举报

ID:353115 发表于 2026-2-2 08:14 | 显示全部楼层
做一个常量数组,进行映射就好了
回复

使用道具 举报

ID:813057 发表于 2026-2-2 10:56 | 显示全部楼层
#include <stdio.h>

/*
* 函数:reverse_4bit
* 功能:将输入的4位二进制数(0-15)的位顺序反转
* 输入:num (0-15)
* 输出:反转后的数值
*/
unsigned char reverse_4bit(unsigned char num)
{
    unsigned char result = 0;

    /* 分别取出每一位,放到镜像位置 */
    if (num & 0x01) result |= 0x08;  /* Bit 0 -> Bit 3 */
    if (num & 0x02) result |= 0x04;  /* Bit 1 -> Bit 2 */
    if (num & 0x04) result |= 0x02;  /* Bit 2 -> Bit 1 */
    if (num & 0x08) result |= 0x01;  /* Bit 3 -> Bit 0 */

    return result;
}

/* 辅助函数:用于打印4位二进制格式 (C89兼容) */
void print_binary(unsigned char num)
{
    unsigned char mask;
    for (mask = 0x08; mask > 0; mask >>= 1) {
        if (num & mask) {
            putchar('1');
        } else {
            putchar('0');
        }
    }
}

void main(void)
{
    unsigned char i;
    unsigned char reversed_val;

    /* 遍历1到15 */
    for (i = 1; i <= 15; i++) {
        reversed_val = reverse_4bit(i);

        /* 打印结果,格式:原值(二进制) -> 结果(二进制) */
        /* 注意:Keil C51环境中printf通常需要重定向串口才能在电脑看到,
           这里仅展示逻辑,实际使用请根据具体硬件环境调整输出方式 */
        printf("%d (", (int)i);
        print_binary(i);
        printf(") -> %d (", (int)reversed_val);
        print_binary(reversed_val);
        printf(")\r\n");
    }

    while(1); /* 程序死循环,防止跑飞 */
}

GLM-4.7给出的答案
回复

使用道具 举报

ID:965189 发表于 2026-2-14 17:19 | 显示全部楼层
谢谢上面几位的热心帮助!我现在用的是查表法。
回复

使用道具 举报

ID:965189 发表于 2026-2-14 17:24 | 显示全部楼层

你这个方法易懂、明白,逐位识别,到对应位组合。谢谢你!
回复

使用道具 举报

ID:275826 发表于 2026-2-14 19:21 | 显示全部楼层
#include<reg51.h>

unsigned char bdata tmp;
sbit b0=tmp^0;
sbit b1=tmp^1;
sbit b2=tmp^2;
sbit b3=tmp^3;
void main(void)
{
   unsigned char x,y;
   while(1)
     { y=0;
           tmp=x;
           y=b0*8|b1*4|b2*2|b3;
         }
}
回复

使用道具 举报

ID:384109 发表于 2026-2-14 21:24 | 显示全部楼层

抱歉,看错了,没问题的
回复

使用道具 举报

ID:883242 发表于 2026-2-15 23:03 | 显示全部楼层
  1. x = (x & 0x55555555) << 1 | (x & 0xAAAAAAAA) >> 1;
  2. x = (x & 0x33333333) << 2 | (x & 0xCCCCCCCC) >> 2;
  3. x = (x & 0x0F0F0F0F) << 4 | (x & 0xF0F0F0F0) >> 4;
  4. x = (x & 0x00FF00FF) << 8 | (x & 0xFF00FF00) >> 8;
  5. x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16;
复制代码


hacker's delight这本书里面的位转置算法,适合32位运算,楼主只要求转置4位,那还是查表法最好。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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