C 用位运算符替换条件检查

C 用位运算符替换条件检查,c,C,我不想使用条件运算符来探索二进制运算符的更多用法。这背后没有任何其他内涵。如果有任何方法,请告诉我。 有什么方法可以做到这一点吗?假设是32位整数和2的互补,下面的方法可以吗 int result = !(x1 >> 31) & (((~x1 + 1) >> 31) & 1); x1 = result !=0 ? x1:result; 我使用了无符号,因为根据标准 E1>>E2的结果是E1右移E2位位置。。。。如果E1具有有符号类型和负值,则

我不想使用条件运算符来探索二进制运算符的更多用法。这背后没有任何其他内涵。如果有任何方法,请告诉我。
有什么方法可以做到这一点吗?

假设是32位整数和2的互补,下面的方法可以吗

int result = !(x1 >> 31) & (((~x1 + 1) >> 31) & 1);
    x1 = result !=0 ? x1:result;

我使用了
无符号
,因为根据标准

E1>>E2
的结果是
E1
右移
E2
位位置。。。。如果
E1
具有有符号类型和负值,则 结果值由实现定义


假设32位整数和2的互补,下面的公式行吗

int result = !(x1 >> 31) & (((~x1 + 1) >> 31) & 1);
    x1 = result !=0 ? x1:result;

我使用了
无符号
,因为根据标准

E1>>E2
的结果是
E1
右移
E2
位位置。。。。如果
E1
具有有符号类型和负值,则 结果值由实现定义



为什么不想使用条件运算符?我只想尝试使用二进制运算符..这只是为了理解!!没有意图。如果可能的话,请让我知道。不要在真实代码中做这样可怕的事情。如今,编译器在大多数情况下都非常聪明,能够判断在给定平台上这种重写何时足够。@JensGustedt。没错,今天的编译器有神奇的优化,但那是因为有些人认为…:)@塞尔吉奥米吉尼,没错。这就是为什么这是一个很糟糕的问题。整个学习和思考经验都受到了某种程度的影响。为什么你不想使用条件运算符?我只想尝试使用二进制运算符。它只是为了理解目的!!没有意图。如果可能的话,请让我知道。不要在真实代码中做这样可怕的事情。如今,编译器在大多数情况下都非常聪明,能够判断在给定平台上这种重写何时足够。@JensGustedt。没错,今天的编译器有神奇的优化,但那是因为有些人认为…:)@塞尔吉奥米吉尼,没错。这就是为什么这是一个很糟糕的问题。整个学习和思考体验都受到了某种程度的损害。为了平台独立性,你可以使用
(sizeof(int)*8)-1
而不是
31
。只是出于好奇的目的,乘法运算符在你的情况下可以用任何二进制运算符替换吗???@studinstru No。重点是
(x>>31)^1
将负数转换为
0
,将非负数转换为
1
。然后你得到
0
乘以x和
0
。当前的变量只使用位算术。是的..这也是做两个补码的好选择。你能用2s补码更新你的答案吗???@user3386109移位负符号整数在C/C++中没有定义,这就是为什么我把它设为无符号的。你可以使用
(sizeof(int)*8)-1
而不是
31
以实现平台独立性。只是出于一个好奇的目的,我们可以用任何二进制运算符替换乘法运算符???@studinstru No。关键是
(x>>31)^1
将负数转换为
0
,将非负数转换为
1
。然后你得到
0
乘以x和
0
。当前的变量只使用位算术。是的..这也是做两个补码的好选择。你能用2s补码更新你的答案吗???@user3386109移位负符号整数在C/C++中是未定义的,这就是为什么我把它设为
无符号的
unsigned int x = (unsigned int)-2;
x &= (x >> 31) - 1;