【问题标题】:mapping between 2 sets of ASCII characters两组 ASCII 字符之间的映射
【发布时间】:2023-03-07 17:11:02
【问题描述】:

我们只需要使用按位 操作来做到这一点。任何提示将不胜感激。刚开始学c。

输入: abcdefghijklmnopqrstuvwxyz 输出: hpxdlt|aiqyemu}bjrzfnv~cks

这是我们被要求遵循的代码存根。

#include <stdio.h>
int main(void)
{
int inChar, outChar;
while ((inChar = getchar()) != EOF)
{
  // Your bitwise code appears here…

  // last instruction in while loop
  putchar(outChar);
}
return 0;
}

函数 getchar() 返回一个 表示来自标准输入的 ASCII 编码字符的整数。putchar() 函数将指定的整数转换为相应的 ASCII 字符并将其发送到标准输出

【问题讨论】:

  • 请不要发送垃圾语言标签。
  • 欢迎来到 SO。我们将帮助您解决问题,但我们不会为您编写。这个问题没有代表提问者付出足够的努力。
  • 我不知道从哪里开始
  • 用二进制写出每个集合的前几个字符的数字,并寻找一个模式。
  • 看二进制对应的字符对。确定每对中保持不变的二进制数部分,以及变化的部分。查看发生变化的部分,然后弄清楚如何变化。

标签: c binary


【解决方案1】:

c# 中的解决方案。我相信你可以为它推导出c中的并行代码。

    static void Main(string[] args)
    {
        using (StreamReader sr = new StreamReader(@"<input_file>"))
        {
            StringBuilder input = new StringBuilder();
            StringBuilder output = new StringBuilder();

            while (sr.Peek() >= 0)
            {
                var charFromFile = sr.Read();
                input.Append((char)charFromFile);

                var isFirstBitset = IsBitSet(charFromFile, 0);
                var isSecondBitset = IsBitSet(charFromFile, 1);
                var isFourthBitset = IsBitSet(charFromFile, 3);
                var isFifthBitset = IsBitSet(charFromFile, 4);

                // If first bit is set
                if (isFirstBitset)
                {
                    charFromFile = SetBit(charFromFile, 3);
                    if (!isFourthBitset)
                        charFromFile = ClearBit(charFromFile, 0);
                }

                // If 2nd bit is set
                if (isSecondBitset)
                {
                    charFromFile = SetBit(charFromFile, 4);
                    if (!isFifthBitset)
                        charFromFile = ClearBit(charFromFile, 1);
                }

                // if 4th bit is set
                if (isFourthBitset)
                {
                    charFromFile = SetBit(charFromFile, 0);
                    if (!isFirstBitset)
                        charFromFile = ClearBit(charFromFile, 3);
                }

                // if 5th bit is set
                if (isFifthBitset)
                {
                    charFromFile = SetBit(charFromFile, 1);
                    if (!isSecondBitset)
                        charFromFile = ClearBit(charFromFile, 4);
                }

                output.Append((char)charFromFile);
            }

            Console.WriteLine("Input = {0}", input.ToString());
            Console.WriteLine("Output = {0}", output.ToString());
        }

    }

    public static bool IsBitSet(int b, int pos)
    {
        return (b & (1 << pos)) != 0;
    }

    public static int SetBit(int value, int bitToSet)
    {
        return value | (int)Math.Pow(2, bitToSet);
    }

    public static int ClearBit(int value, int bitToClear)
    {
        return (value & ~((int)Math.Pow(2, bitToClear)));
    }

【讨论】:

  • 问题是用 C 实现,而不是 C#
  • 我知道。我想通过 c# 提供解决方案逻辑。猜猜用C导出逻辑和实现没什么大不了的。我想你可以在互联网上寻找设置、清除和检查位状态的代码并就地使用它。就是这样!
【解决方案2】:
#include <stdio.h>
#include <math.h>

 bool IsBitSet(int b, int pos)
 {​​​​​​
      return (b & (1 << pos)) != 0;
 }​​​​​​

 int SetBit(int value, int bitToSet)
 {​​​​​​
     return value | (int)pow(2, bitToSet);
 }​​​​​​

 int ClearBit(int value, int bitToClear)
 {​​​​​​
     return (value & ~((int)pow(2, bitToClear)));
 }​​​​​​

  int main(void)
  {​​​​​​
     unsigned char inChar= 0, outChar=0;
while ((inChar = getchar()) != EOF)
{​​​​​​
    // Your bitwise code appears here…
    char isFirstBitset = IsBitSet(inChar, 0);
    char isSecondBitset = IsBitSet(inChar, 1);
    char isFourthBitset = IsBitSet(inChar, 3);
    char isFifthBitset = IsBitSet(inChar, 4);

    // If first bit is set
    if (isFirstBitset)
    {​​​​​​
        inChar = SetBit(inChar, 3);
        if (!isFourthBitset)
            inChar = ClearBit(inChar, 0);
    }​​​​​​

    // If 2nd bit is set
    if (isSecondBitset)
    {​​​​​​
        inChar = SetBit(inChar, 4);
        if (!isFifthBitset)
            inChar = ClearBit(inChar, 1);
    }​​​​​​

    // if 4th bit is set
    if (isFourthBitset)
    {​​​​​​
        inChar = SetBit(inChar, 0);
        if (!isFirstBitset)
            inChar = ClearBit(inChar, 3);
    }​​​​​​

    // if 5th bit is set
    if (isFifthBitset)
    {​​​​​​
        inChar = SetBit(inChar, 1);
        if (!isSecondBitset)
            inChar = ClearBit(inChar, 4);
    }​​​​​​

    outChar = inChar;
    putchar(outChar);
}​​​​​​
return 0;
 }​​​​​​

【讨论】:

  • 查看C语言解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多