如何在一行中找到数字的最左边位
How to find the leftmost bit of an number in one line
如何在一行代码中找出数字的最左边和最右边的位?
好吧,我们可以遍历一个循环,通过左移找出最左边的设置位,但是如何在一行中做到这一点以使另一个不。 设置了谁最左边的位/最右边的位? 像y = x & ~(x-1)会找到最左边的位,但我没有得到这个如何?
有人可以在C++中给出代码并解释吗?
对于最右边的一点,有一个众所周知的技巧。
x=x & -x
将清除 x 中的所有设置位,除了最右边的位。你会发现很多解释为什么这在SO中有效(例如参见这个答案)
要找到它的索引,除了使用内置的编程语言之外,除了做一个循环 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 是否为非空。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 获取数字最左边两个位的值的最便宜的方法是什么?
- 如何在一行中找到数字的最左边位