bitcount.cpp

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 84 行

CPP
84
字号
#include <stdio.h>

union velement {
    char arr[8];
    UBIG val;
};

velement vect[] =
{   { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 }
,   { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 }
,   { 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f }
,   { 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00 }
,   { 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00 }
,   { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
};

#if 0
unsigned count( unsigned x )
{
    unsigned y;

#ifndef __386__
    y = x & 0x5555;
    x = y + (( x ^ y ) >> 1 );
    y = x & 0x3333;
    x = y + (( x ^ y ) >> 2 );
    y = x & 0x0f0f;
    x = y + (( x ^ y ) >> 4 );
    y = x & 0x00ff;
    x = y + (( x ^ y ) >> 8 );
#else
    y = x & 0x55555555;
    x = y + (( x ^ y ) >> 1 );
    y = x & 0x33333333;
    x = y + (( x ^ y ) >> 2 );
    y = x & 0x0f0f0f0f;
    x = y + (( x ^ y ) >> 4 );
    y = x & 0x00ff00ff;
    x = y + (( x ^ y ) >> 8 );
    y = x & 0x0000ffff;
    x = y + (( x ^ y ) >> 16 );
#endif
    return( x );
}

#else
unsigned count( SBIG x )
{
    UBIG y;

    y = x & vect[0].val;
    x = y + (( x ^ y ) >> 1 );
    y = x & vect[1].val;
    x = y + (( x ^ y ) >> 2 );
    y = x & vect[2].val;
    x = y + (( x ^ y ) >> 4 );
    y = x & vect[3].val;
    x = y + (( x ^ y ) >> 8 );
    if( sizeof( UBIG ) < 4 ) return x;
    y = x & vect[4].val;
    x = y + (( x ^ y ) >> 16 );
    if( sizeof( UBIG ) < 8 ) return x;
    y = x & vect[5].val;
    x = y + (( x ^ y ) >> 32 );
    return x;
}
#endif

void test( unsigned long x )
{
    printf( "# bits in %lx is %u\n", x, count( x ) );
}

int main( void )
{
    test( 23 );
    test( 1 );
    test( -1 );
    test( 255 );
    test( 0xaa );
    test( 0x55 );
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?