不使用按位运算符打印一个字节并集的所有位的程序
Program to print all the bits of one byte union without using bitwise operators
我必须编写一个程序来打印一个字节并集的所有位(不能大于那个),而不使用按位运算符。我在构建只有一个字节的合适联合时遇到了问题,因为据我所知我现在不能使用 struct,因为 struct 有 4 个字节。这是我已经完成的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "bit_set.h"
int main(void) {
printf("Input number: ");
if (scanf("%hhu", &word.x) == 0) {
printf("Incorrect input");
return 1;
}
printf("%u %u %u %u %u %u %u %u", word.a+0, word.a+1, word.a+2, word.a+3, word.a+4, word.a+5, word.a+6, word.a+7);
return 0;
}
#ifndef bit_set
#define bit_set
typedef unsigned char byte;
byte x;
union bit {
unsigned int i : 1;
}foo;
union bit_set
{
union bit a[8];
byte x;
}word;
#endif
也许这个任务的重点是使用算术运算而不是按位运算?
这是一个例子:
void printByteBits(unsigned char num)
{
const static int div[8] = {1, 2, 4, 8, 16, 32, 64, 128};
for (int i = 0; i < sizeof(div)/sizeof(div[0]); i++)
{
printf("Bit %d: %d\n", i, (num / div[i]) % 2);
}
}
在此处查看输出:https://godbolt.org/z/xUC663
要先打印出二进制字节的最高有效位,您可以这样做:
void print_bits (unsigned char x)
{
int i;
for (i = 0; i < 8; i++) {
if (x >= 0x80)
printf("1");
else
printf("0");
x = x / 2;
}
}
虽然一般来说我会建议使用按位运算符,因为它们可以更好地转换为机器代码,从而获得更好的性能。相同的函数看起来像这样:
void print_bits (unsigned char x)
{
int i;
for (i = 0; i < 8; i++) {
if (x & 0x80 != 0)
printf("1");
else
printf("0");
x = x << 1;
}
}
请注意,您的代码首先打印最低有效位,这不是通常表示二进制的方式。
我必须编写一个程序来打印一个字节并集的所有位(不能大于那个),而不使用按位运算符。我在构建只有一个字节的合适联合时遇到了问题,因为据我所知我现在不能使用 struct,因为 struct 有 4 个字节。这是我已经完成的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "bit_set.h"
int main(void) {
printf("Input number: ");
if (scanf("%hhu", &word.x) == 0) {
printf("Incorrect input");
return 1;
}
printf("%u %u %u %u %u %u %u %u", word.a+0, word.a+1, word.a+2, word.a+3, word.a+4, word.a+5, word.a+6, word.a+7);
return 0;
}
#ifndef bit_set
#define bit_set
typedef unsigned char byte;
byte x;
union bit {
unsigned int i : 1;
}foo;
union bit_set
{
union bit a[8];
byte x;
}word;
#endif
也许这个任务的重点是使用算术运算而不是按位运算? 这是一个例子:
void printByteBits(unsigned char num)
{
const static int div[8] = {1, 2, 4, 8, 16, 32, 64, 128};
for (int i = 0; i < sizeof(div)/sizeof(div[0]); i++)
{
printf("Bit %d: %d\n", i, (num / div[i]) % 2);
}
}
在此处查看输出:https://godbolt.org/z/xUC663
要先打印出二进制字节的最高有效位,您可以这样做:
void print_bits (unsigned char x)
{
int i;
for (i = 0; i < 8; i++) {
if (x >= 0x80)
printf("1");
else
printf("0");
x = x / 2;
}
}
虽然一般来说我会建议使用按位运算符,因为它们可以更好地转换为机器代码,从而获得更好的性能。相同的函数看起来像这样:
void print_bits (unsigned char x)
{
int i;
for (i = 0; i < 8; i++) {
if (x & 0x80 != 0)
printf("1");
else
printf("0");
x = x << 1;
}
}
请注意,您的代码首先打印最低有效位,这不是通常表示二进制的方式。