Questions tagged «bit-manipulation»

单个位的操作。使用的运算符可能包括按位与,或,异或,非,左移和右移。

12
说明使用位向量确定所有字符是否唯一
我对位向量如何实现此功能感到困惑(对位向量不太熟悉)。这是给出的代码。有人可以帮我解决这个问题吗? public static boolean isUniqueChars(String str) { int checker = 0; for (int i = 0; i < str.length(); ++i) { int val = str.charAt(i) - 'a'; if ((checker & (1 << val)) > 0) return false; checker |= (1 << val); } return true; } 特别是,这是checker怎么做的?


10
^ = 32背后的想法是什么,将小写字母转换为大写字母,反之亦然?
我正在解决代码部队上的一些问题。通常我首先检查字符是大写还是小写英文字母,然后减去或加上32以将其转换为相应的字母。但是我发现有人会^= 32做同样的事情。这里是: char foo = 'a'; foo ^= 32; char bar = 'A'; bar ^= 32; cout << foo << ' ' << bar << '\n'; // foo is A, and bar is a 我已经搜索了对此的解释,但没有找到。那为什么行得通呢?

9
为什么XOR是组合哈希的默认方法?
假设您有两个哈希H(A),H(B)并且想要将它们组合在一起。我读过,将两个散列组合在一起的一种好方法是XOR,例如XOR( H(A), H(B) )。 这些哈希函数准则在此简要地介绍了我找到的最佳解释: 对具有大致随机分布的两个数字进行异或运算会导致另一个仍具有大致随机分布*的数字,但是现在取决于这两个值。 ... *在要组合的两个数字的每一位,如果两位相等,则输出0,否则为1。换句话说,在50%的组合中,将输出1。因此,如果两个输入位各自有大约50-50的可能性为0或1,那么输出位也是如此。 您能解释为什么XOR应该是用于组合哈希函数(而不是OR或AND等)的默认操作的直觉和/或数学方法吗?

8
'and'(布尔值)vs'&'(按位)-为什么列表与numpy数组在行为上有所不同?
是什么解释了列表和NumPy数组上布尔运算和按位运算的行为差异? 我&对and在Python中正确使用vs 感到困惑,如以下示例所示。 mylist1 = [True, True, True, False, True] mylist2 = [False, True, False, True, False] >>> len(mylist1) == len(mylist2) True # ---- Example 1 ---- >>> mylist1 and mylist2 [False, True, False, True, False] # I would have expected [False, True, False, False, False] # ---- Example 2 …

3
为什么这个随机值的分布是25/75,而不是50/50?
编辑:所以基本上我想写的是1位哈希double。 我想将映射double到true或false有50/50的机会。为此,我编写了选择一些随机数的代码(仅作为示例,我想在具有规则性的数据上使用它并仍然获得50/50的结果),检查它们的最后一位,并递增y其是否为1,或者n是否为1。0。 但是,此代码始终导致25%y和75%的结果n。为什么不是50/50?为什么会有这样奇怪但直接的(1/3)分布呢? public class DoubleToBoolean { @Test public void test() { int y = 0; int n = 0; Random r = new Random(); for (int i = 0; i < 1000000; i++) { double randomValue = r.nextDouble(); long lastBit = Double.doubleToLongBits(randomValue) & 1; if (lastBit == 1) { …


15
我应该使用#define,enum还是const?
在我正在研究的C ++项目中,我有一个标志类型的值,可以有四个值。这四个标志可以组合。标志描述数据库中的记录,可以是: 新纪录 删除记录 修改记录 现有记录 现在,对于每条记录,我希望保留此属性,因此可以使用一个枚举: enum { xNew, xDeleted, xModified, xExisting } 但是,在代码的其他位置,我需要选择对用户可见的记录,因此我希望能够将其作为单个参数传递,例如: showRecords(xNew | xDeleted); 因此,似乎我有三种可能的解决方法: #define X_NEW 0x01 #define X_DELETED 0x02 #define X_MODIFIED 0x04 #define X_EXISTING 0x08 要么 typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType; 要么 namespace RecordType …

22
设置的最低有效位的位置
我正在寻找一种有效的方法来确定设置为整数的最低有效位的位置,例如对于0x0FF0它将是4。 一个简单的实现是这样的: unsigned GetLowestBitPos(unsigned value) { assert(value != 0); // handled separately unsigned pos = 0; while (!(value & 1)) { value >>= 1; ++pos; } return pos; } 有什么想法可以减少一些周期吗? (注意:这个问题是针对喜欢这种东西的人,而不是告诉我xyzoptimization是邪恶的。) [edit] 谢谢大家的想法!我也学到了其他一些东西。凉!

27
查找C中整数的最高设置位(msb)的最快/最有效方法是什么?
如果我有一些整数n,并且我想知道最高有效位的位置(也就是说,如果最低有效位在右边,那么我想知道最远的左位为1),找出最快/最有效的方法是什么? 我知道POSIX ffs()在strings.h中支持一种方法来查找第一个设置位,但是似乎没有相应的fls()方法。 是否有一些我确实不知道的真正明显的方法? 如果无法使用POSIX函数进行可移植性该怎么办? 编辑:在32位和64位体系结构上均可使用的解决方案怎么样(许多代码清单似乎只在32位int上运行)。


30
在C / C ++中,最简单的方法来反转字节中的位顺序?
尽管有多种方法可以反转字节中的位顺序,但我对开发人员实现“最简单”的方法感到好奇。通过反转,我的意思是: 1110 -> 0111 0010 -> 0100 这类似于但不重复此 PHP问题。 这类似于但不是此 C问题的重复项。这个问题要求开发人员最简单的方法来实施。“最佳算法”与内存和CPU性能有关。
110 c++  c  bit-manipulation 

16
按位操作和用法
考虑以下代码: x = 1 # 0001 x << 2 # Shift left 2 bits: 0100 # Result: 4 x | 2 # Bitwise OR: 0011 # Result: 3 x & 1 # Bitwise AND: 0001 # Result: 1 我可以用Python(和其他语言)理解算术运算符,但是我对“按位”运算符却不太了解。在上面的示例(来自Python书)中,我了解了左移功能,但不了解其他两个。 另外,按位运算符实际上是做什么用的?我会喜欢一些例子。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.