【问题标题】:Bitwise Shifting in CC中的按位移位
【发布时间】:2010-04-11 15:09:56
【问题描述】:

我最近决定开展一个通过手机发送和接收 SMS 的 SMS 项目。

数据以 PDU 格式发送 - 我需要将 ASCII 字符更改为 7 位 GSM 字母字符。为此,我遇到了几个示例,例如http://www.dreamfabric.com/sms/hello.html

此示例显示第二个 septet 的最右边位被插入到第一个 septect 中,以创建一个 octect。

按位移位不会导致这种情况发生,因为 >> 将插入左侧,而

谢谢,

【问题讨论】:

  • 啊,这又勾起了我的回忆。 :) 我只是喜欢他们如何定义服务号码和电话号码的编码方式......
  • 如果你的问题是C语言中没有rotate n指令,一般可以用>>n<<(length-n)|模拟。
  • 您不需要按位旋转。您需要 adjacent 字节的低位,而不是移出当前字节的位。

标签: c ascii bit-manipulation rotation shift


【解决方案1】:

这是一个快速的算法:

int b1, bnext;
int mod;
int pand;
char *b; // this is your byte buffer, with message content
int blen; // this is your byte buffer length
char sb[160];
int totchars = 0;

b1 = bnext = 0;
for (int i=0; i < blen; i++) {
    mod = i%7;
    pand = 0xff >> (mod + 1);
    b1 = ((b[i] & pand) << mod) | bnext;
    bnext = (0xff & b[i]) >> (7 - mod);
    sb[totchars++] = (char)b1;
    if (mod == 6) {
        sb[totchar++] = (char)bnext;
        bnext = 0;
    }
}
sb[totchar] = 0;

它将 7 位压缩缓冲区转换为 C 中的常规 ASCII 字符数组。

【讨论】:

    【解决方案2】:

    谁能告诉我如何移动位 从右侧插入 他们在左边?

    在 C 中有间接的方法,但我只是这样做:

    void main()
    {
        int x = 0xBAADC0DE;
        __asm
        {
            mov eax, x;
            rol eax, 1;
        }
    }
    

    这会将位向左旋转(而不是移位!)(一步)。 "ror" 将向右旋转。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多