c - 分解位模式、移位并创建新模式

标签 c bit

作为更大问题的一部分,我必须采用一些二进制值:00000000 11011110 (8)

然后,我必须:

  1. 导出此函数中的位数 - 因此我通过找到最大 sig 数字的位置来完成此操作。
  2. 然后将该值的前 6 个数字存储到值 128 中,使其等于:10011110
  3. 然后将该值的最后 5 个数字存储到值 192 中,使其等于:11000011 10011110
  4. 这两个字节应该存储在某个数组中,buffer[]

我已经编写了这个函数,但是,位置似乎没有在 gdb 中正确初始化,并且值没有正确输出。这是我的尝试:

  void create_value(unsigned short init_val, unsigned char buffer[])
  {
    // get the count
    int position = 0;
    while (init_val >>= 1)
            position++;

    // get total
    int count = position++;

            int start = 128;

            for (int i = 0; i < 7; i++)
                    if (((1 << i) & init_val) != 0) start = start | 1 << i;


            buffer[0] = start;

            start = 192;

            for (int i = 7; i < 11; i++) {
                    if (((1 << i) & init_val) !=0) start = start | 1 << i;
            }

            buf[1] = start;
    }

最佳答案

之后

while (init_val >>= 1)
        position++;

init_val 将为 0。当您以后使用时

if (((1 << i) & init_val) != 0) start = start | 1 << i;

你永远不会改变开始

所以,在阅读完您尝试要做的事情(描述得很困惑)后,为什么不:

void create_value(unsigned short init_value, unsigned char buffer[])
{
    buffer[0] = (init_value & 63) | 128;
    buffer[1] = ((init_value >> 6) & 31) | 192;
    return;
}

它的作用:init_value & 63 根据需要屏蔽 init_value 中除最低 6 位之外的所有位。 | 128 然后设置字节的最高有效位(请注意,IFF CHAR_BIT == 8)。
(init_value >> 6) 将 init_value 下移 6 位,因此现在原始位 6-11 变为位 0-4& 31 屏蔽该值中最低 5 位的所有位,| 192 设置两个最高有效位。

关于c - 分解位模式、移位并创建新模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24871096/

相关文章:

c - 在不使用任何预定义函数的情况下在 C 中进行字符串匹配?

c - 矩阵段错误

c# - 内存中的int32存储

c - 不确定 c 中的 fseek 语法

c - Ansi C - 删除换行符并将其更改为空格

c - 未初始化时结构中的值是什么?

c - 字符串中的二进制位模式转换为 C 中的十六进制数

c# - 在 C# 中设计比特流

c - 打印符号位

c - 在 C 中以原子方式比较两个整数的最快方法?