如果字节中的所有位都设置为高,则设置为高字节

Set all bits in byte high if one is high

本文关键字:设置 字节 高字节 如果      更新时间:2023-10-16

如果它的任何位很高,我需要将字节中的所有位设置为高。如果它们都不高,则所有位都应该是低电平。

因此,如果字节0000 1000则应设置为1111 1111,如果0000 0000,则应保持0000 0000

我将如何在不使用 if 语句的情况下做到这一点?

我已经尝试使用按位运算符执行此操作,但是我不太清楚如何做到这一点。

我还在互联网上(也是Stackoverflow(上搜索了如何做到这一点,但我什么也没找到。

一个简单的if可以完成工作:

if (byte) {
    byte = -1; // 0xFFFF..
}

如果a不是0,您希望设置所有位。一个简单的方法是:

unsigned char setallbits(unsigned char a) {
    return (a != 0) ? ~0U : 0;
}

为了避免测试,您可以考虑a != 0的评估结果为 10 ,然后否定:

unsigned char setallbits(unsigned char a) {
    return -(a != 0);
}

或者使用惯用!!aa转换为布尔值:

unsigned char setallbits(unsigned char a) {
    return -!!a;
}

最后 2 个函数假定负值的 2 补码表示。纯粹主义者可以实现到过时的架构的可移植性,这些架构表示带有符号/幅度的负整数或带有-(unsigned)(a != 0)-(unsigned char)!!a的补码,这些或就像预期的那样神秘。

无符号版本:

unsigned char foo(unsigned char x)
{
    return x ? ~0 : x;
}

所有带有 !! 或 != 的解决方案都意味着条件语句。