提取int二进制表示的最后四位数

时间:2014-12-03 04:08:40

标签: c

我有一个提取二进制表示的最后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;

}

4 个答案:

答案 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