[英]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.