有点笨拙 [英] Bit twiddling
问题描述
我写了几个程序,只打印两个方向的
中的位。请欣赏任何帮助来改进它们。
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屋!