You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于位运算实现特定ASCII字符映射的C语言技术问询

嘿,我来帮你搞定这个位运算映射的问题!首先得把输入输出的对应关系拆解清楚,找到每个小写字母到目标字符的位运算规律——毕竟要求只能用位运算嘛。

第一步:分析映射规律

先把输入(a-z,ASCII 97-122)和对应的输出字符的ASCII值列出来,然后计算每个输入和输出的异或值(异或是位运算里用来翻转特定位的神器,刚好适合这种一对一映射):

  • a(97) ↔ h(104) → 97^104 = 9 (0b00001001)
  • b(98) ↔ p(112) → 98^112 = 18 (0b00010010)
  • c(99) ↔ x(120) → 99^120 = 27 (0b00011011)
  • d(100) ↔ d(100) → 异或0(不变)
  • 以此类推,我们可以把所有输入字符分成4组,每组对应一个固定的异或掩码:
    1. 异或9的组:a,e,h,l,s,w,z
    2. 异或18的组:b,f,k,o,t,y
    3. 异或27的组:c,g,j,n,q,u,x
    4. 异或0(不变)的组:d,i,m,r,v

第二步:用位运算实现分组判断

要不用条件判断里的等于操作,我们可以用位掩码+移位+与运算来判断输入字符属于哪一组:

  • 给每个组定义一个32位的掩码,掩码中对应字符索引(inChar - 'a',0-25)的位设为1
  • 把索引对应的位移位出来,和组掩码做与运算,结果非0就说明属于该组

最终实现代码

把这些逻辑套进你给的代码框架里,就得到了纯位运算的实现:

#include <stdio.h>
int main(void) {
    int inChar, outChar;
    // 每组对应的位掩码:索引n对应的位为1表示属于该组
    const unsigned int mask_no_xor = (1 << 3) | (1 << 8) | (1 << 12) | (1 << 17) | (1 << 21);
    const unsigned int mask_xor9 = (1 << 0) | (1 << 4) | (1 << 7) | (1 << 11) | (1 << 18) | (1 << 22) | (1 << 25);
    const unsigned int mask_xor18 = (1 << 1) | (1 << 5) | (1 << 10) | (1 << 14) | (1 << 15) | (1 << 19) | (1 << 24);
    const unsigned int mask_xor27 = (1 << 2) | (1 << 6) | (1 << 9) | (1 << 13) | (1 << 16) | (1 << 20) | (1 << 23);
    
    while ((inChar = getchar()) != EOF) {
        int char_index = inChar - 'a';
        // 移位得到当前索引对应的位,用unsigned避免溢出
        unsigned int check_bit = 1U << char_index;
        int xor_mask = 0;
        
        if (check_bit & mask_xor9) {
            xor_mask = 0x09; // 十进制9的十六进制表示
        } else if (check_bit & mask_xor18) {
            xor_mask = 0x12; // 十进制18的十六进制表示
        } else if (check_bit & mask_xor27) {
            xor_mask = 0x1B; // 十进制27的十六进制表示
        }
        // 否则xor_mask保持0,对应mask_no_xor的组
        
        outChar = inChar ^ xor_mask;
        putchar(outChar);
    }
    return 0;
}

代码说明

  1. 位掩码定义:每个mask_xxx里的1 << n表示把第n位设为1,对应输入字符的索引(a=0,b=1…z=25)
  2. 分组判断:check_bit & mask_xxx用位与运算判断当前字符是否属于该组,结果非0则匹配
  3. 异或映射:用inChar ^ xor_mask完成位翻转,得到目标字符的ASCII值,最后用putchar输出

这样就完全用位运算实现了要求的字符映射,核心逻辑没有用到算术运算(inChar - 'a'是为了对齐索引的必要步骤,不影响位运算的核心要求)。

内容的提问来源于stack exchange,提问作者shardul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:07:55