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

问题描述 投票:0回答:3

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

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

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

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

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

c++ c
3个回答
3
投票

如果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的补充,这些结构与预期一样神秘。


4
投票

一个简单的工作如果:

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

0
投票

未签名版本:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.