能否用纯位运算实现该if语句?

acdbxzyw 2011-07-10 10:43:40
int x;
//...
if(0 != x)
{
x = 1;
}

能否用简单的纯位运算实现该if语句?
请各位指教。。。
...全文
640 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 pochioly 的回复:]

!!x

believe me
[/Quote]
++
Roy_Smiling 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 relive007 的回复:]
C/C++ code


int x;

if(!(x|0x00000000))
{
x = 1;
}
[/Quote]

如果x=0那么x=1 ;如果x非0 那么x 不变。
风吹PP凉SS 2011-07-11
  • 打赏
  • 举报
回复
表达式?A:B
acdbxzyw 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sbwwkmyd 的回复:]

如果x是32位的
C/C++ code
x = (~((uint)x-1) | (uint)x) >> 31
[/Quote]
厉害,判断符号位的方法真不错!
b2b160 2011-07-11
  • 打赏
  • 举报
回复
!!x 确实非常简洁,不过核心还是用了比较,没有单纯使用移位。
cmp dword ptr [x],0
setne al

用纯位移的话还是
x = (~((uint)x-1) | (uint)x) >> 31
比较符合要求,

还可以换个形式
((-(unsigned int)x) | x )>> 31
acdbxzyw 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 pochioly 的回复:]

!!x

believe me
[/Quote]
呵呵,虽然不是位运算,也很不错!
sanae 2011-07-11
  • 打赏
  • 举报
回复
!!x

believe me
2011-07-10
  • 打赏
  • 举报
回复
忽然发现我在 1 楼写的语句竟然都没有分号……
taodm 2011-07-10
  • 打赏
  • 举报
回复
楼主做什么软件啊,需要考虑这么一点点速度?
真讲速度,上汇编啊,直接有指令的。
至善者善之敌 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 joanlynnlove 的回复:]
引用 1 楼 hpsmouse 的回复:

假设 x 是 32 位:
C/C++ code
x |= x >> 16
x |= x >> 8
x |= x >> 4
x |= x >> 2
x |= x >> 1
x &= 1

其实这个办法比直接比较要慢……

学习了,这个方法挺好,只是确实比较慢。。。
我想的是取出x最后一个1进行比较,但是无法确定最……
[/Quote]
最后一个1 那还如何判断是否是0

relive007 2011-07-10
  • 打赏
  • 举报
回复

int x;

if(!(x|0x00000000))
{
x = 1;
}
lyhylex 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sbwwkmyd 的回复:]
如果x是32位的

C/C++ code
x = (~((uint)x-1) | (uint)x) >> 31
[/Quote]
acdbxzyw 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dontkissbossass 的回复:]

x = x == 0? 0:1

这算么?
[/Quote]
不算呀,能否用简单的位运算做呢?
acdbxzyw 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hpsmouse 的回复:]

假设 x 是 32 位:
C/C++ code
x |= x >> 16
x |= x >> 8
x |= x >> 4
x |= x >> 2
x |= x >> 1
x &= 1

其实这个办法比直接比较要慢……
[/Quote]
学习了,这个方法挺好,只是确实比较慢。。。
我想的是取出x最后一个1进行比较,但是无法确定最后一个1在哪一位上,所以不知道该怎么快速移位。。。
一根烂笔头 2011-07-10
  • 打赏
  • 举报
回复
能,具体我说不出实例
DontKissBossAss 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 joanlynnlove 的回复:]
C/C++ code

int x;
//...
if(0 != x)
{
x = 1;
}

能否用简单的纯位运算实现该if语句?
请各位指教。。。
[/Quote]

x = x == 0? 0:1

这算么?

2011-07-10
  • 打赏
  • 举报
回复
假设 x 是 32 位:
x |= x >> 16
x |= x >> 8
x |= x >> 4
x |= x >> 2
x |= x >> 1
x &= 1

其实这个办法比直接比较要慢……
showjim 2011-07-10
  • 打赏
  • 举报
回复
如果x是32位的
x = (~((uint)x-1) | (uint)x) >> 31
2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 b2b160 的回复:]
x=0,0
x=1,1
x=2,1
x=3,1
x=10000,1
[/Quote]
x=32,0
b2b160 2011-07-10
  • 打赏
  • 举报
回复
x=0,0
x=1,1
x=2,1
x=3,1
x=10000,1
加载更多回复(10)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧