1
14
这里有一个稍微更有效的版本,使用位旋转。
|
2
15
更新 :在上面添加了一些代码,这些代码可以用于更有限的性能保证(如果您想这样想的话,可以使用更少的无边界)。有趣的是,这比原始的未注释版本执行得更好。 以下是一种快速但无限制性能保证的替代方法:
|
3
4
编辑:固定,考虑到约束“一个非0的位” 选取一个介于0和31之间的随机数n(对于32位整数),并使用它通过向左移动1 n次来生成位掩码。重复此操作,直到原始数字中的位n不是0。将位掩码求反,使其只有1位设置为0,然后使用&运算符将其与原始数字组合:
|
4
4
好啊:
但我想知道:你为什么需要/想要这个? |
5
3
你可以通过1来打开或“使用它”,通过按位补码来关闭或“使用它”。 下面是一个选择随机1位并关闭它的示例。
|
6
1
您可以使用位数组来概括这一点。
但是,您必须为简单的数据类型编写助手函数。
如果使用大的位数组,可以通过迭代两次来节省内存。
测试程序。
|
7
0
计算整数中的所有1。 使用您最喜欢的1到第一个计数之间的随机数生成器选择一个随机数。 为整数中的随机th 1创建一个掩码。 或者你的整数加上掩码。 |
8
0
编辑:修正了一些逻辑。
|
9
0
尝试以下代码
|
10
0
|
11
0
好吧,很多错误的答案。这是一个有效的方法:
下面是一些示例代码:
编辑: 在第五次阅读这个问题时,我有一个问题作为回报:你想做以下哪一项:
编辑2:
在这种情况下,我的通用算法是这样的:只需使用内部逻辑选择步骤1中的位。或者,在步骤1中选择一个完全随机的位,然后重复,直到myint和randomlyzeroedbitint的值不相等。 不幸的是,这两种情况都意味着一种更复杂的算法,因为您要么需要对值中的每个位进行迭代以确定要翻转哪个位,要么需要循环该算法直到翻转一个位。 |
12
0
这是一个基于 algorithm 从 Bit Twiddling Hacks 选择整数的第n个集合位。对于这种情况,我们只需随机选择n。 代码被移植到C,使其直接作用于32位有符号整数,并从右开始而不是从左开始计数。此外,删除所有分支的优化并没有在这里保留,因为它在我的计算机上生成了较慢的代码(Intel Core 2 Quad Q9450)。 Bit-Twidling Hacks页面上的描述并不能很好地了解该算法的工作原理。我已经花了时间对它进行了一步又一步的逆向工程,我发现的内容将在下面的评论中详细描述。 在我的测试中,该算法的性能非常类似于Kyteland的优秀FlipRandomBit,它可以随机分布在32位整数的整个范围内。但是,FlipRandomBit对于设置位明显少于清除位的数字稍快。相反,对于设置位明显多于清除位的数字,该算法速度稍快。 OP的基准测试完全由小的正整数组成,它不会强调FlipRandomBit的最坏情况。如果这是预期输入的指示,那么更倾向于FlipRandomBit。
|
13
-1
|
Emopusta · 从后端到前端的图像路径不工作 2 年前 |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
Niyazi Babayev · 如何在表达式中动态应用表达式? 2 年前 |
Dansih · .Net核心自定义身份验证方案 2 年前 |
lolorekkk · 面板插入。NET WinForm 2 年前 |