Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C uint8\u t中的二进制序列_C - Fatal编程技术网

C uint8\u t中的二进制序列

C uint8\u t中的二进制序列,c,C,我试图用c语言为嵌入式应用程序创建一个表,其中每行是8位序列,例如: 11010011 01010011 10000000 然后我需要有函数来设置/清除/读取任何行中的任何位。最有效的方法是什么 对于位操作,我想使用: uint8_t msk = 0x01; row3 |= msk; 但要做到这一点,我想我需要将第3行和每一行定义为uint8_t,并将其转换为十六进制,这就引出了我的第二个问题: 如何在uint8\t中存储8位二进制序列?我见过不同的方法来完成类似的任务,比如我们讨论过的那种

我试图用c语言为嵌入式应用程序创建一个表,其中每行是8位序列,例如:

11010011
01010011
10000000
然后我需要有函数来设置/清除/读取任何行中的任何位。最有效的方法是什么

对于位操作,我想使用:

uint8_t msk = 0x01;
row3 |= msk;
但要做到这一点,我想我需要将第3行和每一行定义为uint8_t,并将其转换为十六进制,这就引出了我的第二个问题:

如何在uint8\t中存储8位二进制序列?我见过不同的方法来完成类似的任务,比如我们讨论过的那种,但没有一种对我有效。你能帮助我吗?
谢谢。

C没有用于输入二进制文本的语法,因此您应该将它们键入八进制或十六进制,例如

uint8_t row1 = 0xd3;
uint8_t row2 = 0x53;
uint8_t row3 = 0x80;
有关如何操作特定位的信息,请参见

row3 |= mask;

将设置掩码中设置的位。

如果我理解正确,您需要一个十六进制数列表,并且希望操作列表中任何元素中的位。我会制作一个无符号整数数组,数组的大小由表中所需的元素数定义

    #include <stdio.h>
    #include <stdint.h>
    #define LIST_SIZE 3

    //accepts the array and sets bit_pos bit of the list idx
    int set_bit(uint8_t* hex_list, int list_idx, int bit_pos){
        hex_list[list_idx] = hex_list[list_idx] | 0x01<<bit_pos; //left shift by the bit position you want to set
    }

    int clear_bit(uint8_t* hex_list, int list_idx, int bit_pos){
        hex_list[list_idx] = hex_list[list_idx] & ~(0x01<<bit_pos); //left shifts and does logical inversion to get the bit to clear
    }

    int main(void) {
        uint8_t hex_list[LIST_SIZE] = {0x00, 0x01, 0x02};
        set_bit(hex_list, 0, 1); // will make 0th element 0x00-> 0x02 by seting bit position 1
        clear_bit(hex_list, 1,0); //will make 1st element 0x01-> 0x00 by clearing bit position 0

        set_bit(hex_list, 2, 0); // will make 2nd element 0x02->0x03 by setting bit at position 1
        clear_bit(hex_list, 2 , 0);// will make 2nd element 0x03 ->0x02 by clearing bit at position 0

        //print the result and verify
        for(int i = 0; i<LIST_SIZE; ++i){
            // modified array will be {0x02, 0x00, 0x02}
            printf("elem%d = %x \n", i, hex_list[i]); 
        }
        return 0;
    }

uint8_t in表示一个8位无符号整数,其值可以在0二进制表示=00000000到255二进制表示=11111111之间变化

要在C中表示二进制位模式,通常使用十六进制表示法。十六进制的用途是一个十六进制数字正好与4个二进制数字重合,因此根据经验,您可以在16个十六进制数字和您头脑中相应的二进制值之间快速转换,对于更长的整数,只需依次转换每个数字-一次4位。用二进制表示长整数很快变得不切实际

因此,您的表可以表示为:

uint8_t row[] = { 0xd3, // 11010011
                  0x53, // 01010011
                  0x80  // 10000000
                } ;
然后按以下方式设置/清除位:

row[2] |= mask ;  // Set mask bits
row[0] &= mask ;  // Clear mask bits
要创建指定编号位的掩码而不硬编码十六进制值,可以使用以下表达式:

uint8_t mask = 1<<7 | 1<<5 | 1<<0 ;  // 10100001 mask bits 0, 5 & 7
通过为每个二进制值详尽地定义宏,可以在保持可视化的同时有效地编码这样的表;e、 g:

#define B_00000000 0x00 
#define B_00000001 0x01 
#define B_00000010 0x02 
#define B_00000011 0x03 
#define B_00000100 0x04 
...
#define B_11111110 0xfe 
#define B_11111111 0xff
注意:要创建上述宏,最好编写一个代码生成器,即生成代码的程序,并将宏放入头文件中

给定这些宏,您可以将表表示为:

uint8_t row[] = { B_11010011
                  B_01010011
                  B_10000000
                } ;
或字符的位图,因此:

uint8_t charA[] = { B_00000000,  
                    B_00011000,  
                    B_00100100,  
                    B_01000010,  
                    B_01111110,  
                    B_01000010,  
                    B_01000010,  
                    B_00000000 } ;
在运行时串行接收位的情况下,可以使用顺序掩码和移位构建相应的uint8\t:

uint8_t getByte()
{
    uint8_t mask = 0x80 ;
    uint8_y byte = 0 ;

    while( mask != 0 )
    {
        uint8_t bit = getBit() ;
        byte |= bit ? mask : 0 ;
        mask >>= 1 ;
    }

    return byte ;
}

getBit函数的作用是让您定义;例如,它可以读取文件、字符串或键盘输入,但必须分别返回零或非零或二进制数字0和1。如果首先接收到LSB数据,则掩码从0x01开始,并且Pound x[n>>3]|=13]&=~1不确定十六进制的位置,因为您想进行位操作,而不是从ASCII转换。请在每篇文章中问一个问题。您提到了第3行,但问题没有定义它或任何一行。请发布显示问题的。显示输入、预期输出和实际输出。没有一个为我工作过,也没有给我们任何关于以下方面的线索:1。您在代码中尝试了什么?2.代码的哪些部分不起作用?3.它们以什么方式不起作用?请注意,将其转换为十六进制也是错误的想法。您需要将其转换为uint8_t-hex只是整数的源代码表示形式。0x0c、12、014和“\x0c”都以十六进制、十进制、八进制和字符文字常量表示相同的整数值,任何值都可以分配给uint8,并生成相同的机器级代码。但大多数现代实现has@P__J__也许您可以添加一个显示此语法的答案。我不会要求更多!我用了你答案的不同部分来解决我的问题。非常感谢你:
uint8_t getByte()
{
    uint8_t mask = 0x80 ;
    uint8_y byte = 0 ;

    while( mask != 0 )
    {
        uint8_t bit = getBit() ;
        byte |= bit ? mask : 0 ;
        mask >>= 1 ;
    }

    return byte ;
}