我有一个提取二进制表示的最后4个数字的问题
我的电话号码是:1111 1001
我得到了第一个4
但是我有问题要得到最后四个^:
# include <stdio.h>
# include <stdlib.h>
# define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d\n"
# define BYTETOBINARY(byte) \
(byte & 0x80 ? 1 : 0), \
(byte & 0x40 ? 1 : 0), \
(byte & 0x20 ? 1 : 0), \
(byte & 0x10 ? 1 : 0), \
(byte & 0x08 ? 1 : 0), \
(byte & 0x04 ? 1 : 0), \
(byte & 0x02 ? 1 : 0), \
(byte & 0x01 ? 1 : 0)
int main()
{
int num = 505;
PRINTBIN (num);
// int result = num & bitwise;
//PRINTBIN(result);
// first num;
int i;
int bit=0x01;
int bitwise;
for (i =0;i<4;i++)
{
int bit1=bit<<i;
bitwise = bit1|bit;
}
printf("1:%d\n", bitwise);
PRINTBIN(bitwise);
//second num;
int bitwise1;
int b0 = 0;
int bit2;
for(i=0;i<4;i++)
{
bit2 = bit<<(4+i);
bitwise1 = bit2|b0;
PRINTBIN(bit2);
}
printf("2:%d\n",bitwise1);
PRINTBIN(bitwise1);
return 0;
}
答案 0 :(得分:2)
这比你正在做的更简单:num & 0x0f
将获得最后四个,然后你只需用printf("%04b\n", num &0x0f);
打印成二进制文件。编辑:%b说明符是非标准的!可能不应该使用它,而是使用下面的示例。 /编辑
十六进制中的任何f
都是二进制的1111
,这样可以轻松拉出这些四重奏。如果你不能只使用printf,你也可以通过一次屏蔽一个来轻松打印,然后将数字换成另一个显示。例如:
for(int i = 0; i < 4; i++) {
printf("%c", (number & 8) ? '1' : '0'); // print the number on the left of the quartet
number <<= 1; // shift it to the right by one position, putting the next bit in position to print next loop around
}
位操作中的其他有用技巧是将一个转换为一个掩码。要从右边开始获取位#n,请执行number & (1 << n)
。向左移动零次的是一次 - 该掩码使您获得最不重要(最右侧)位。一个向左移动一个是两个,第二个最低有效位,依此类推。您的bit1 = bit << i
行就是这样做的,但我更倾向于使用文字1
来表明这个技巧并不一定是变量。
答案 1 :(得分:2)
如果您只想显示4位数字,只需使用查找表,因为我们已经知道所有可能的表示形式。
如果您想在其他位置显示另外4位数字,只需在num&0x0F
之后进行移位,但掩码将是其他值,而不是0x0F
const char * bin[16] = {
"0000",
"0001",
"0010",
......
"1111"
};
printf("%s\n", bin[num&0x0F]);
答案 2 :(得分:0)
num & 0xF
将提取最后一位数字。
要打印最后4个,代码可以使用:
printf("%04d", (num&8)*125 + (num&4)*25 + (num&2)*5 + (num&1));
使用八进制的另一种方法:
要打印最不重要的8,代码可以使用:
printf("%08lo",
(num&128)*16384LU + (num&64)*4096L + (num&32)*1024L + (num&16)*256 +
(num&8)*64 + (num&4)*16 + (num&2)*4 + (num&1));
此方法最多可使用21位和unsigned long long
使用多项式或for
循环。
答案 3 :(得分:0)
The following function extractAllBitsFromIntToArray
Parameters:
int value: the source integer to use for the extraction
int* totalBits: pointer to callers' area to receive size of returned int array
Returns:
int* a pointer to a malloc'd array that contains the extracted bits from 'value'
least significant bit at offset 0 into the array.
note: the caller must 'free()' this array when done using it
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TOTAL_BITS (sizeof(int)<<3) // assumes 8 bit bytes
#define BIT_MASK(count) (1<<count)
int * extractAllBitsFromIntToArray( int value, int* numBits)
{
int i = 0; // loop counter
int *pRetArray = NULL;
if( NULL == (pRetArray = malloc( TOTAL_BITS*sizeof(int)) ) ) // array to return
{
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
memset( pRetArray, 0x00, TOTAL_BITS*sizeof(int) ); // clear array
// extract bits, where pRetArray[0] is LSB
for( i=0; i<TOTAL_BITS; i++ )
{
pRetArray[i] = (value&(BIT_MASK(i)))? 1:
}
return( pRetArray );
} // end function: extractAllBitsFromIntToArray