關于代碼應該做什么的背景,與我正在實作的目標。所以 dec2bin 函式應該從陣列 dec_nums[]={0, 1, 77, 159, 65530, 987654321} 中獲取十進制值/數字;
該函式應該將值轉換為二進制數并將其列印出來。轉換正確完成,但是它向后列印二進制檔案。
有人可以幫助我找出問題所在,或者是否有其他方法可以達到正確的結果?
int main() {
int dec_nums[] = {0, 1, 77, 159, 65530, 987654321};
int i;
printf("=== dec2bin ===\n");
for (i = 0; i < sizeof(dec_nums) / sizeof(int); i )
dec2bin(dec_nums[i]);
return 0;
}
void dec2bin(int num) {
int saveNum = num;
if (saveNum == 0) {
printf("\nBinary Number of %d", saveNum);
printf(" = 0");
} else {
int number;
int i;
printf("\nBinary Number of %i", saveNum);
printf(" = ");
for (i = 0; num > 0; i ) {
number = num % 2;
num = num / 2;
printf("%i", number);
}
printf("\n");
}
}
uj5u.com熱心網友回復:
對于位擺弄無符號型別是可取的,您可以避免由于下溢/溢位而導致的未定義行為的任??何型別的問題。
除此之外,您還可以對位掩碼進行操作:
for(unsigned mask = 1u << sizeof(mask) * CHAR_BIT - 1; mask; mask >>= 1)
{
unsigned bit = (value & mask) != 0;
// print it
}
CHAR_BIT是 char 中的位值,來自 header limits.h,通常(但不一定)是 8,通常有 4 個位元組用于ints 您將掩碼初始化為1 << 31并進一步向下移動直到它到達1 << 0,即 1,這是尚未考慮的最后一個值。另一個移位將單個位移出mask,因此您得到 0 并且回圈中止。
上面的代碼將列印前導零,如果您想跳過它們,您可以預先設定另一個簡單地向下移動直到滿足第一個 1 位的回圈。
此變體從最高有效位開始;你總是得到% 2最低有效位 - 這就是你得到相反順序的原因。
旁注:獲取陣列的長度最好是sizeof(array)/sizeof(*array)- 如果您需要更改陣列的基礎型別,這可以避免錯誤......
uj5u.com熱心網友回復:
一個簡單的解決方案是將位寫入 char 陣列,從陣列的末尾開始,與我們手動執行的方式相同。
您的dec2bin函式將變為(只有最小的更改,添加或更改行的注釋):
void dec2bin(int num)
{
// declare a char array of size number_of_bits_in_an_int 1 for the terminating null
char bin[sizeof(int) * CHAR_BIT 1];
char* ix = bin sizeof(bin) - 1; // make ix point to the last char
*ix-- = '\0'; // and write the terminating null
int saveNum = num;
if (saveNum == 0)
{
printf("\nBinary Number of %d", saveNum);
printf(" = 0");
}
else
{
int number;
int i;
printf("\nBinary Number of %i", saveNum);
printf(" = ");
for (i = 0; num > 0; i )
{
number = num % 2;
num = num / 2;
*ix-- = '0' number; // just write the bit representatin
}
printf("%s\n", ix 1); //print the binary representation
}
}
這足以得到預期的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416404.html
標籤:
