有点笨拙 [英] Bit twiddling

查看:77
本文介绍了有点笨拙的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我写了几个程序,只打印两个方向的
中的位。请欣赏任何帮助来改进它们。


1.

#include< stdio.h>

#include< limits.h>

void printbits_reverse(unsigned char a){

int i;

for(i = 0; i< CHAR_BIT; i ++)

((0x1< ;< i)& a)? printf(" 1"):printf(" 0"); }

int main()

{

unsigned char a = 0x96;

printbits_reverse(a);

返回0;

}


现在这里循环剂看起来最好的代码。如何将它精炼为

更好和通用代码?


2.

#include< stdio.h>

struct twid {

未签名:24; / *跳过位31 - > 8用于大端机器* /

无符号bit1:1;

无符号bit2:1;

无符号bit3:1;

无符号bit4:1;

无符号bit5:1;

无符号bit6:1;

无符号bit7:1;

unsigned bit8:1;

};


void print(struct twid * tw)

{

tw-> bit1?printf(" 1"):printf(" 0");

tw-> bit2?printf(" 1" ;):printf(" 0");

tw-> bit3?printf(" 1"):printf(" 0");

tw - > bit4?printf(" 1"):printf(" 0");

tw-> bit5?printf(" 1"):printf(" 0") ;

tw-> bit6?printf(" 1"):printf(" 0");

tw-> bit7?printf(" 1" ;):printf(" 0");

tw-> bit8?printf(" 1"):printf(" 0");

printf (" \ n");

}


int main()

{

unsigned val = 0x96;

struct twid * tw =(struct twid *)& val;

print(tw);

返回0;

}


这不是通用代码(有点特定于平台),但打印函数中printf'的那长篇

列表不是再一次非常体面的方式。可以使用循环或任何构造来打印值吗?


TIA,

Hi,
I have written a couple of programs which just prints the bits in
both directions.Would appreciate any help to refine them a bit.

1.
#include<stdio.h>
#include<limits.h>
void printbits_reverse(unsigned char a){
int i;
for(i=0 ; i < CHAR_BIT ; i++)
((0x1<<i) & a) ? printf("1") : printf("0"); }
int main()
{
unsigned char a = 0x96;
printbits_reverse(a);
return 0;
}

Now here the loop dosent look the best of code.How can I refine it to
better and generic code ?

2.
#include<stdio.h>
struct twid{
unsigned :24; /* skip bits 31 -> 8 for big-endian machines */
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
unsigned bit8:1;
};

void print(struct twid *tw)
{
tw->bit1?printf("1"):printf("0");
tw->bit2?printf("1"):printf("0");
tw->bit3?printf("1"):printf("0");
tw->bit4?printf("1"):printf("0");
tw->bit5?printf("1"):printf("0");
tw->bit6?printf("1"):printf("0");
tw->bit7?printf("1"):printf("0");
tw->bit8?printf("1"):printf("0");
printf("\n");
}

int main()
{
unsigned val = 0x96;
struct twid *tw = (struct twid *) &val ;
print(tw);
return 0;
}

This is not a generic code ( a bit platform specific), but that long
list of printf''s in the print function isnt again a very decent way.Can
I use a loop or any construct to print the values ?

TIA,

推荐答案

grid写道:


我写了几个程序,只打印了
中的位两个方向。感谢任何帮助,以提炼它们。

#include< stdio.h>
#include< limits.h>
void printbits_reverse(unsigned char a){
int i;
for(i = 0;我< CHAR_BIT; i ++)
((0x1<< i)& a)? printf(" 1"):printf(" 0"); }
int main()
{
unsigned char a = 0x96;
printbits_reverse(a);
返回0;
}
<现在这里的循环剂看起来是最好的代码。我怎样才能将它改进为更好的通用代码?

Hi,
I have written a couple of programs which just prints the bits in
both directions.Would appreciate any help to refine them a bit.

1.
#include<stdio.h>
#include<limits.h>
void printbits_reverse(unsigned char a){
int i;
for(i=0 ; i < CHAR_BIT ; i++)
((0x1<<i) & a) ? printf("1") : printf("0"); }
int main()
{
unsigned char a = 0x96;
printbits_reverse(a);
return 0;
}

Now here the loop dosent look the best of code.How can I refine it to
better and generic code ?




#include< stdio。 h>

#include< limits.h>


void printbits_reverse(unsigned char a);

void bit_str(char * s1,const void * s2,size_t n);

unsigned char bit_rev(unsigned char byte);


int main(void)

{

unsigned char a = 0x96;


printbits_reverse(a);

返回0;

}


void printbits_reverse(unsigned char a)

{

char string [CHAR_BIT + 1];


a = bit_rev(a);

bit_str(string,& a,1);

puts(string); < br $>
}


void bit_str(char * s1,const void * s2,size_t n)

{

unsigned mask;

const unsigned char * const byte = s2;


while(n--!= 0){

mask =((unsigned char )-1>> 1)+ 1;

do {

* s1 ++ =(char)(mask& byte [n]?''1'':''0'') ;

mask>> = 1;

} while(mask!= 0);

}

* s1 =''\''';

}


unsigned char bit_rev(unsigned char byte)

{

unsigned hi_mask,lo_mask;


hi_mask =((unsigned char)-1>> 1)+ 1;

lo_mask = 1;

do {

if(!(byte& hi_mask)!=!(byte& lo_mask)){

字节^ = hi_mask | lo_mask;

}

hi_mask>> = 1;

lo_mask<< = 1;

} while(hi_mask> lo_mask);

返回字节;

}



#include<stdio.h>
#include<limits.h>

void printbits_reverse(unsigned char a);
void bit_str(char *s1, const void *s2, size_t n);
unsigned char bit_rev(unsigned char byte);

int main(void)
{
unsigned char a = 0x96;

printbits_reverse(a);
return 0;
}

void printbits_reverse(unsigned char a)
{
char string[CHAR_BIT + 1];

a = bit_rev(a);
bit_str(string, &a, 1);
puts(string);
}

void bit_str(char *s1, const void *s2, size_t n)
{
unsigned mask;
const unsigned char *const byte = s2;

while (n-- != 0) {
mask = ((unsigned char)-1 >> 1) + 1;
do {
*s1++ = (char)(mask & byte[n] ? ''1'' : ''0'');
mask >>= 1;
} while (mask != 0);
}
*s1 = ''\0'';
}

unsigned char bit_rev(unsigned char byte)
{
unsigned hi_mask, lo_mask;

hi_mask = ((unsigned char)-1 >> 1) + 1;
lo_mask = 1;
do {
if (!(byte & hi_mask) != !(byte & lo_mask)) {
byte ^= hi_mask | lo_mask;
}
hi_mask >>= 1;
lo_mask <<= 1;
} while (hi_mask > lo_mask);
return byte;
}


6月1日星期三2005 20:04:29 +0530,grid< pr ****** @ gmail.com>写道:
On Wed, 01 Jun 2005 20:04:29 +0530, grid <pr******@gmail.com> wrote:

我写了几个程序,只打印两个方向的位。请欣赏任何帮助来改进它们。

1.
#include< stdio.h>
#include< limits.h>
void printbits_reverse(unsigned char a){
int i ;(i = 0; i< CHAR_BIT; i ++)
((0x1<< i)& a)? printf(" 1"):printf(" 0"); }


哦,我不认为这太糟糕了,但显而易见的优化是

制作一个字符串(而不是打印每个字符串)数字单独)然后

打印该字符串。


void printbits_reverse(unsigned char a)

{

int i;

char MyBitstring [CHAR_BIT + 1];


for(i = 0; i< CHAR_BIT; ++ i)<如果(a& 1)

MyBitstring [i] =''1';

否则

MyBitstring [i] =''0'';

a>> = 1;

}

MyBitstring [CHAR_BIT] =''\''';

printf("%s",MyBitstring);

return;

}


2.
#include< stdio.h>
struct twid {
unsigned:24; / *跳过位31 - > 8用于大端机器* /
无符号bit1:1;
无符号bit2:1;
无符号bit3:1;
无符号bit4:1;
无符号bit5 :1;
无符号bit6:1;
无符号bit7:1;
无符号bit8:1;
};

void print(struct twid * tw)
{
tw-> bit1?printf(1):printf(0);
tw-> bit2?printf(1) :printf(" 0");
tw-> bit3?printf(" 1"):printf(" 0");
tw-> bit4?printf(" 1" ;):printf(0);
tw-> bit5?printf(1):printf(0);
tw-> bit6?printf(" ; 1"):printf(0);
tw-> bit7?printf(1):printf(0);
tw-> bit8?printf (1):printf(" 0");
printf(" \ n");
}
int main()
{
未签名val = 0x96;
struct twid * tw =(struct twid *)& val;
print(tw);
返回0;
}
这不是通用代码(有点特定于平台),但打印功能中的printf'的长列表也不是一个非常好的方法。可以使用循环或任何构造打印这些值?
Hi,
I have written a couple of programs which just prints the bits in
both directions.Would appreciate any help to refine them a bit.

1.
#include<stdio.h>
#include<limits.h>
void printbits_reverse(unsigned char a){
int i;
for(i=0 ; i < CHAR_BIT ; i++)
((0x1<<i) & a) ? printf("1") : printf("0"); }
Oh, I don''t think it''s too bad but an obvious optimization would be to
make a string (instead of printing each digit individually) and then
print that string.

void printbits_reverse(unsigned char a)
{
int i;
char MyBitstring[CHAR_BIT + 1];

for (i = 0; i < CHAR_BIT; ++ i)
{
if (a & 1)
MyBitstring[i] = ''1'';
else
MyBitstring[i] = ''0'';
a >>= 1;
}
MyBitstring[CHAR_BIT] = ''\0'';
printf("%s", MyBitstring);
return;
}

2.
#include<stdio.h>
struct twid{
unsigned :24; /* skip bits 31 -> 8 for big-endian machines */
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
unsigned bit8:1;
};

void print(struct twid *tw)
{
tw->bit1?printf("1"):printf("0");
tw->bit2?printf("1"):printf("0");
tw->bit3?printf("1"):printf("0");
tw->bit4?printf("1"):printf("0");
tw->bit5?printf("1"):printf("0");
tw->bit6?printf("1"):printf("0");
tw->bit7?printf("1"):printf("0");
tw->bit8?printf("1"):printf("0");
printf("\n");
}

int main()
{
unsigned val = 0x96;
struct twid *tw = (struct twid *) &val ;
print(tw);
return 0;
}

This is not a generic code ( a bit platform specific), but that long
list of printf''s in the print function isnt again a very decent way.Can
I use a loop or any construct to print the values ?




这是丑陋的,不可移植的并且依赖于未指明的行为(你不能知道是否b
知道是否布局了位域从左到右,反之亦然)。



It''s ugly, unportable and relies on unspecified behaviour (you cannot
know whether bitfields are laid out from left to right or vice versa).


2005年6月1日星期三17:32:37 +0200,Paul Mesken< us *** **@euronet.nl>

写道:
On Wed, 01 Jun 2005 17:32:37 +0200, Paul Mesken <us*****@euronet.nl>
wrote:
void printbits_reverse(unsigned char a)
{
int i;
char MyBitstring [CHAR_BIT + 1];

for(i = 0;我< CHAR_BIT; ++ i)
{
if(a& 1)
MyBitstring [i] =''1'';
其他
MyBitstring [i] =' '0';
a>> = 1;
}
MyBitstring [CHAR_BIT] =''\ 0'';
printf("%s" ,MyBitstring);
返回;
}
void printbits_reverse(unsigned char a)
{
int i;
char MyBitstring[CHAR_BIT + 1];

for (i = 0; i < CHAR_BIT; ++ i)
{
if (a & 1)
MyBitstring[i] = ''1'';
else
MyBitstring[i] = ''0'';
a >>= 1;
}
MyBitstring[CHAR_BIT] = ''\0'';
printf("%s", MyBitstring);
return;
}




顺便说一句,只是为了好玩:


for(i = 0; i< CHAR_BIT; ++ i)

{

MyBitstring [i] =''0''+(a& 1) ;

a>> = 1;

}


但我不知道是否''1''每个字符中的值大于''0',或者C支持的
设置(但是对于EBCDIC和ASCII都可以)。



By the way, just for fun :

for (i = 0; i < CHAR_BIT; ++ i)
{
MyBitstring[i] = ''0'' + (a & 1);
a >>= 1;
}

But I don''t know whether ''1'' is 1 greater than ''0'' in every character
set that C supports (but it''s okay for both EBCDIC and ASCII).


这篇关于有点笨拙的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆