如果某个字节的任何位为高,则我需要将其设置为高。如果它们都不为高,则所有位都应为低。
因此,如果字节为0000 1000
,则应将其设置为1111 1111
;如果字节为0000 0000
,则应保留为0000 0000
。
我该怎么做而不必使用if语句?
我已经尝试使用按位运算符来执行此操作,但是我不太清楚如何执行此操作。
我也在互联网上(也在Stackoverflow上)搜索了如何执行此操作,但没有找到任何东西。
答案 0 :(得分:4)
一项简单的工作:
if (byte) {
byte = -1; // 0xFFFF..
}
答案 1 :(得分:3)
如果a
不是0
,则要设置所有位。一种简单的方法是:
unsigned char setallbits(unsigned char a) {
return (a != 0) ? ~0U : 0;
}
为避免测试,您可以考虑将a != 0
评估为1
或0
,然后将其取反:
unsigned char setallbits(unsigned char a) {
return -(a != 0);
}
或使用惯用的!!a
将a
转换为布尔值:
unsigned char setallbits(unsigned char a) {
return -!!a;
}
最后2个函数采用负数的二进制补码表示。纯粹主义者可以实现将其移植到过时的体系结构的便利性,这些体系结构表示具有符号/幅度的负整数或用-(unsigned)(a != 0)
或-(unsigned char)!!a
进行补码的整数,与预期的一样神秘。
答案 2 :(得分:0)
未签名版本:
unsigned char foo(unsigned char x)
{
return x ? ~0 : x;
}
所有解决方案!或!=表示条件语句。