我不知道如何在C中打印__m128i变量的位 所以随时告诉我你的想法!
谢谢!
答案 0 :(得分:3)
然而,你这样做将是一个可怕的黑客。脱离我的头脑(__m128i是一个128位/ 16字节对齐类型)我能想到这个:
__m128i toPrint;
char * bytearray = (char *) &toPrint;
for(int i = 0; i < 16; i++) printf("%02hhx", bytearray[i]);
这以十六进制打印,但它很难看。
答案 1 :(得分:2)
为了打印这些位,我实现了以下程序。
//Linx-mint 18.1, gcc 6.2, Skylake.
#include <x86intrin.h>
#include <stdio.h>
void printVec8(__m128i vec)
{
int i;
char array[16];
_mm_store_si128( (__m128i *) array, vec);
for(i=0; i<16; i++){
printf("%3u , " , array[i]);
}
printf("\n");
}
inline void vec_print_128Bits(__m128i vec)
{
__m128i bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7;
__m128i mask = _mm_set_epi8(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
//fisrt separate them and print to check them:
bit0 = _mm_and_si128(vec , mask); printf("bit0 :"); printVec8(bit0);
bit1 = _mm_and_si128(_mm_srai_epi16(vec,1) , mask); printf("bit1 :"); printVec8(bit1);
bit2 = _mm_and_si128(_mm_srai_epi16(vec,2) , mask); printf("bit2 :"); printVec8(bit2);
bit3 = _mm_and_si128(_mm_srai_epi16(vec,3) , mask); printf("bit3 :"); printVec8(bit3);
bit4 = _mm_and_si128(_mm_srai_epi16(vec,4) , mask); printf("bit4 :"); printVec8(bit4);
bit5 = _mm_and_si128(_mm_srai_epi16(vec,5) , mask); printf("bit5 :"); printVec8(bit5);
bit6 = _mm_and_si128(_mm_srai_epi16(vec,6) , mask); printf("bit6 :"); printVec8(bit6);
bit7 = _mm_and_si128(_mm_srai_epi16(vec,7) , mask); printf("bit7 :"); printVec8(bit7);
//now store them in array
char bits[8][16];
_mm_store_si128( (__m128i *) bits[0], bit0);
_mm_store_si128( (__m128i *) bits[1], bit1);
_mm_store_si128( (__m128i *) bits[2], bit2);
_mm_store_si128( (__m128i *) bits[3], bit3);
_mm_store_si128( (__m128i *) bits[4], bit4);
_mm_store_si128( (__m128i *) bits[5], bit5);
_mm_store_si128( (__m128i *) bits[6], bit6);
_mm_store_si128( (__m128i *) bits[7], bit7);
//and now print them all:
int i, j;
printf("all bits : \n");
for(i=0; i<16; i++){
for( j=7; j>=0; j--)
{
printf("%u ", bits[j][i]);
}
//printf("\n");
}
}
int main()
{
__m128i vec = _mm_setr_epi8(0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F); printf("vec :"); printVec8(vec);
vec_print_128Bits(vec);
return 0;
}
输出结果是:
vec : 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
bit0 : 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ,
bit1 : 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 ,
bit2 : 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 ,
bit3 : 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
bit4 : 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
bit5 : 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
bit6 : 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
bit7 : 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
all bits :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1
答案 2 :(得分:2)
递归函数,用于打印__m128i
整数值的所有128位。
// Private helper function
static void print_128_bitsH(__m128i val, int depth)
{
if (depth > 0)
print_128_bitsH(val >> 1, depth - 1);
printf("%d", (int)(val & 1));
}
// Print 128 bits, from most significant to least significant
void print_128_bits(__m128i val)
{
print_128_bitsH(val, 128);
printf("\n");
}
答案 3 :(得分:1)
与打印32位整数的位确实没什么不同。将128位向量存储为四个32位整数,然后按顺序打印每个位的位。
void print_bits128(__m128i v) {
int t[4];
_mm_storeu_si128((__m128i*)t, v);
for(int i=0; i<4; i++) {
int num = t[i];
for(int j=0; j<32; j++){
printf("%u",num&0x80000000 ? 1 : 0);
num <<= 1;
}
}
puts("");
}