簡體   English   中英

完全刪除最高有效位

[英]Completely removing most significant bit

我不知道如何處理這個……我想將存儲為 int 1111的二進制文件更改為也存儲為 int 的111

我通常不回答“給我編碼”的問題,但這是一個有趣的問題,所以我這樣做是為了好玩。 像往常一樣,大部分時間都在處理諸如輸出代碼之類的無關內容。

如果這是家庭作業,務必花時間了解代碼的工作原理,否則您只會自欺欺人。

#include <stdio.h>
#include <string.h>

// Define "number" as an unsigned number of desired size
typedef unsigned long number;

number drop_msb(number n);
char *ntob(char *dest, number n, int min_len);

int main()
{
    number i;
    number j;
    char ibuf[65];
    char jbuf[65];

    for (i = 0; i < 512; i++) {
        j = drop_msb(i);
        ntob(ibuf, i, 0);
        ntob(jbuf, j, strlen(ibuf) - 1);
        printf("%s --> %s\n", ibuf, jbuf);
    }

    return 0;
}

number drop_msb(number n)
{
    number bit;
    number a;

    // Handle special case
    if (n == 0)
        return 0;

    // Set highest bit
    bit = ((number) -1 >> 1) ^ (number) -1;

    // Guaranteed to terminate
    while (1) {
        a = n ^ bit;
        if (a < n)
            return a;
        bit >>= 1;
    }
}

char *ntob(char *dest, number n, int min_len)
{
    /* Convert n to shortest binary string, padding with zeroes on left
     * to make it at least min_len characters long. dest should be long
     * enough to hold the maximum number, plus terminating null. */

    char *left;
    char *right;

    /* min_len should be >= 1, to handle n == 0 correctly. Also needs to
     * be non-negative to avoid bad pointer during padding. */
    if (min_len < 1)
        min_len = 1;

    // Build with lsb on left
    for (right = dest; n; right++, n >>= 1)
        *right = '0' | (n & 1);

    // Pad if needed
    while (right < dest + min_len)
        *right++ = '0';

    *right = '\0';

    // Reverse it
    for (left = dest, right--; left < right; left++, right--) {
        *left ^= *right;
        *right ^= *left;
        *left ^= *right;
    }

    return dest;
}
unsigned int test(unsigned int n)
{
unsigned int answer = 1;

while(n>>=1 && n)
{
    answer <<= 1;
} 
answer = (answer-1);
return answer;
}

這應該可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM