【问题标题】:How to find the leftmost bit of an number in one line如何在一行中找到一个数字的最左边位
【发布时间】:2019-05-29 10:56:00
【问题描述】:

如何在一行代码中找出一个数字的最左位和最右位?

好吧,我们可以遍历一个循环以通过左移找出最左边的设置位,但是如何在一行中执行此操作以使另一个否。设置了谁的最左边位/最右边位? 像 y = x & ~(x-1) 会找到最左边的位,但我没有得到这个怎么办?

谁能给出 C++ 的代码并解释一下?

【问题讨论】:

  • 1) 你没有用语言标记;有许多语言带有非语义换行符,所以 any 程序可以是微不足道的单行程序。 2)你为什么需要这个?这是一场高尔夫(尽可能短的代码编写的难题挑战),还是其他一些要求?它是否需要快速,或者只是没有换行符? 3)你有没有尝试过什么?你研究过吗?
  • 找到最左/最右位是什么意思?返回仅设置此位的值?还是返回这个位的索引?
  • 4) 一些编程语言具有内置函数或库函数,可以满足您的需求。例如,在 Ruby 中,x.bit_length - 1 将为您提供最高设置位的索引。 5)通过将数字转换为二进制表示(许多语言本身支持),然后使用indexrindexlen之类的字符串函数来找到它们(尽管它是不是最高效的方式)。

标签: c++ bit


【解决方案1】:

对于最右边的那位,有一个众所周知的技巧。

x=x & -x

将清除 x 中的所有设置位,除了最左边的位。你会发现很多解释为什么这在 SO 中有效(例如参见 this answer

要找到它的索引,除了使用编程语言的内置函数外,别无他法,只能做一个循环 AFAIK。请注意,此循环可以展开为只有一个衬里。

pos = (16*(x&0xffff0000)!=0) + (8*(x&0xff00ff00)!=0) + (4&(x&0xf0f0f0f0)!=0) + (2*(x&0x66666666)!=0)+(x&0xaaaaaaaa)!=0)

x 是前一个操作的结果(即仅设置了最右边的位),它通过测试该位是否在上半字中起作用,在这种情况下,位置将> 16,然后是偶数字节,偶数轻咬等等。

另一种解决方案,是使用数学运算符log2

pos=(int)log2((double)x)

对于最左边的位,AFAIK,除了通过循环之外,没有办法在位级别做到这一点。但是可以使用 log2() 来找到最左边的位的位置。

然后,要返回一个只设置此位的 int,可以使用右移。

x = 1 << ((int) log2((double)x))

这将只保留 x 中最左边的位。

注意之前检查 x 是否为非空值。

【讨论】:

  • @Amadan 他没有说“唯一的方法”。你在说什么? Alain 没有使用内置函数进行响应。那么,您为什么要提出这种担忧呢?
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2018-08-11
  • 2022-10-14
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多