如果一个为高电平,则将所有位设置为高字节

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果一个为高电平,则将所有位设置为高字节相关的知识,希望对你有一定的参考价值。

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

因此,如果字节是0000 1000它应该设置为1111 1111,如果它是0000 0000,它应该只保留0000 0000

如果不使用if语句,我将如何做到这一点?

我已经尝试使用按位运算符执行此操作,但我无法弄清楚如何执行此操作。

我还在互联网(也是Stackoverflow)上搜索了如何做到这一点,但我没有找到任何东西。

答案

如果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);
}

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

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

最后2个函数假设负值的二进制补码表示。纯粹主义者可以实现对过时的体系结构的可移植性,这些体系结构代表具有符号/大小的负整数或与-(unsigned)(a != 0)-(unsigned char)!!a的补充,这些结构与预期一样神秘。

另一答案

一个简单的工作如果:

if (byte) {
    byte = -1; // 0xFFFF..
}
另一答案

未签名版本:

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

所有的解决方案!!或!=暗示条件陈述。

以上是关于如果一个为高电平,则将所有位设置为高字节的主要内容,如果未能解决你的问题,请参考以下文章

与门或门非门与非门或非门异或门

三菱fx系列plc怎样像arduino一样设置某个脚为高电平?

什么是与门、或门、非门和异或门

IIC协议

IIC协议介绍

如图,请教74系列TTL电路输出端状态的判断(高电平,低电平,高阻态)