将 char 转换为二进制位,即:'a' 转换为二进制等价物
Converting a char to binary bits, i.e.: 'a' to binary equivalent
我希望能快速掌握我的代码。在我的函数做其他事情之前,我需要将 char c
转换为二进制。但是,我收到的错误提示是我使用 itoa
错误,我不确定还有什么方法可以尝试这部分功能。
主要功能是:
char *alpha = "abcde";
unsigned char bits[8];
for (int pos=0;pos<5;pos++)
{
printf( "%c ", alpha[pos] );
char2bits( alpha[pos], bits );
}
到目前为止,我所拥有的功能是:
void char2bits( char c, unsigned char bits[8] ){
for(int i = 0; i < 5; i++){
itoa(c, (bits)[i], 2);
}
// ...
}
char2bits()
的可能实现:
void char2bits(char c, unsigned char bits[8]) {
for (size_t i = 0; i < 8; i += 1) {
bits[i] = (c >> (7 - i)) & 1;
}
}
int main(void) {
char c = 3;
unsigned char bits[8];
char2bits(c, bits);
// now `bits` is equal to {0, 0, 0, 0, 0, 0, 1, 1}
for (size_t i = 0; i < 8; i += 1) {
printf("%hhu\n", bits[i]);
}
return 0;
}
首先,当你想使用字节时,你应该使用 unsigned char 或 uint8_t。
此函数将一个字节转换为 printable 字符串(您可以使用 printf 或将“bits”数组放入):
void char2bits(unsigned char c, unsigned char bits[8]) {
int shift, i;
for(shift = 7, i = 0; i < 8; --shift, ++i)
bits[i] = ((c >> shift) & 0x1) + '0';
}
发生什么事了?
c = 250 = 1111 1010
首先你的位 table 是空的,所以:
位 = ""
步骤 i = 0:
(c >> shift) = 右移 7 = 0000 0001
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "1";
步骤 i = 1:
(c >> shift) = 右移 6 = 0000 0011
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "11";
步骤 i = 2:
(c >> shift) = 右移 5 = 0000 0111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "111";
步骤 i = 3:
(c >> shift) = 右移 4 = 0000 1111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "1111";
步骤 i = 4:
(c >> shift) = 右移 3 = 0001 1111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "11111";
步骤 i = 5:
(c >> shift) = 右移 2 = 0011 1110
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = ascii 格式的 '0'
所以位 = "111110";
步骤 i = 6:
(c >> shift) = 右移 1 = 0111 1101
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 1 + 48 = 49 = ascii 格式的 '1'
所以位 = "1111101";
步骤 i = 7:
(c >> shift) = 右移 0 = 1111 1010
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = ascii 格式的 '0'
所以位 = "11111010";
希望对你有所帮助
这是我的做法
void char2bits( char c, unsigned char bits[8] )
{
for( int i = 0; i < 8; ++i)
{
// create a mask for bit `i`
int mask = 1 << i;
// set the corresponding member of the `bits` array to 0 or 1
// depending on the value of the relevant bit
bits[i] = (c & mask) ? '1' : '0';
}
}
希望这是清楚的。
基本技术是使用按位和 &
运算符从输入字符中去除单个位。当循环执行时,掩码将具有值 1、2、4、8 等。我将 &
的结果输入三元运算符 test ? a : b
以在输出数组中存储“1”或“0”字符。
这相当于写出来
if(c & mask)
bits[i] = '1';
else
bits[i] = '0';
请注意,我已经迭代了所有 8 个可能的位,而不是您的代码使用的 5 个。另请注意,在输出中,bits[0]
将保留输入字符 c
.
的 最低有效位
我希望能快速掌握我的代码。在我的函数做其他事情之前,我需要将 char c
转换为二进制。但是,我收到的错误提示是我使用 itoa
错误,我不确定还有什么方法可以尝试这部分功能。
主要功能是:
char *alpha = "abcde";
unsigned char bits[8];
for (int pos=0;pos<5;pos++)
{
printf( "%c ", alpha[pos] );
char2bits( alpha[pos], bits );
}
到目前为止,我所拥有的功能是:
void char2bits( char c, unsigned char bits[8] ){
for(int i = 0; i < 5; i++){
itoa(c, (bits)[i], 2);
}
// ...
}
char2bits()
的可能实现:
void char2bits(char c, unsigned char bits[8]) {
for (size_t i = 0; i < 8; i += 1) {
bits[i] = (c >> (7 - i)) & 1;
}
}
int main(void) {
char c = 3;
unsigned char bits[8];
char2bits(c, bits);
// now `bits` is equal to {0, 0, 0, 0, 0, 0, 1, 1}
for (size_t i = 0; i < 8; i += 1) {
printf("%hhu\n", bits[i]);
}
return 0;
}
首先,当你想使用字节时,你应该使用 unsigned char 或 uint8_t。
此函数将一个字节转换为 printable 字符串(您可以使用 printf 或将“bits”数组放入):
void char2bits(unsigned char c, unsigned char bits[8]) {
int shift, i;
for(shift = 7, i = 0; i < 8; --shift, ++i)
bits[i] = ((c >> shift) & 0x1) + '0';
}
发生什么事了?
c = 250 = 1111 1010
首先你的位 table 是空的,所以: 位 = ""
步骤 i = 0:
(c >> shift) = 右移 7 = 0000 0001
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "1";
步骤 i = 1:
(c >> shift) = 右移 6 = 0000 0011
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "11";
步骤 i = 2:
(c >> shift) = 右移 5 = 0000 0111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "111";
步骤 i = 3:
(c >> shift) = 右移 4 = 0000 1111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "1111";
步骤 i = 4:
(c >> shift) = 右移 3 = 0001 1111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'
所以位 = "11111";
步骤 i = 5:
(c >> shift) = 右移 2 = 0011 1110
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = ascii 格式的 '0'
所以位 = "111110";
步骤 i = 6:
(c >> shift) = 右移 1 = 0111 1101
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 1 + 48 = 49 = ascii 格式的 '1'
所以位 = "1111101";
步骤 i = 7:
(c >> shift) = 右移 0 = 1111 1010
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000
((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = ascii 格式的 '0'
所以位 = "11111010";
希望对你有所帮助
这是我的做法
void char2bits( char c, unsigned char bits[8] )
{
for( int i = 0; i < 8; ++i)
{
// create a mask for bit `i`
int mask = 1 << i;
// set the corresponding member of the `bits` array to 0 or 1
// depending on the value of the relevant bit
bits[i] = (c & mask) ? '1' : '0';
}
}
希望这是清楚的。
基本技术是使用按位和 &
运算符从输入字符中去除单个位。当循环执行时,掩码将具有值 1、2、4、8 等。我将 &
的结果输入三元运算符 test ? a : b
以在输出数组中存储“1”或“0”字符。
这相当于写出来
if(c & mask)
bits[i] = '1';
else
bits[i] = '0';
请注意,我已经迭代了所有 8 个可能的位,而不是您的代码使用的 5 个。另请注意,在输出中,bits[0]
将保留输入字符 c
.