Tag: 位操作

在C / C ++中,最简单的方法是颠倒一个字节中的位的顺序?

虽然有多种方法可以反转字节中的位顺序,但我很好奇开发人员实现的“最简单”。 而通过颠倒我的意思是: 1110 -> 0111 0010 -> 0100 这是相似的,但不是这个 PHP问题的重复。 这是类似的,但不是这个 C问题的重复。 这个问题是要求开发人员实现最简单的方法。 “最佳algorithm”与内存和CPU性能有关。

你有没有在实际项目中使用位移?

你有没有在真正的编程项目中使用位移 ? 大多数(如果不是全部的话)高级语言都有移位操作符,但是什么时候才需要使用它们呢?

给定一个整数,我怎样才能find使用bit-twiddling的下一个最大功耗?

如果我有一个整数n ,我怎样才能find下一个数k > n ,使得k = 2^i ,其中一些i元素是按位移或逻辑的。 例如:如果我有n = 123 ,我怎样才能findk = 128 ,这是2的幂,而不是124 ,只能被2整除。 这应该是简单的,但它逃避了我。

减去/增加值,没有溢出或下溢

想象一下,我有两个无符号的字节b和x 。 我需要计算bsub作为b – x和badd作为b + x 。 但是,在这些操作过程中,我不想发生下溢/溢出。 例如(伪代码): b = 3; x = 5; bsub = b – x; // bsub must be 0, not 254 和 b = 250; x = 10; badd = b + x; // badd must be 255, not 4 明显的做法包括分支: bsub = b – min(b, x); badd […]

C / C ++检查是否有一个位被设置,即intvariables

int temp = 0x5E; // in binary 0b1011110. 有没有这样的方法来检查位3的温度是1还是0,没有位移和掩码。 只是想知道是否有一些内置的function,或者我不得不自己写一个。

增加“蒙面”的位集

我目前正在编写一个树枚举器,我遇到了以下问题: 我正在查看掩码的位集,即设置位是掩码子集的位集,即带掩码1010101 。 我想要完成的是增加位集,但只有掩码位。 在这个例子中,结果是0010000 。 为了使其更清楚一点,只提取掩码位,即0011 ,将它们递增到0100并再次将它们分配给掩码位,得到0010000 。 有没有人看到一个有效的方法来做到这一点,而不是手动使用bitscans和前缀掩码的组合执行操作?

为什么如果(n和-n)== n那么n是2的幂?

java.util.Random源代码行294说 if ((n & -n) == n) // ie, n is a power of 2 // rest of the code 为什么是这样?

解释使用位向量来确定是否所有字符都是唯一的

我很困惑如何位vector如何做到这一点(不太熟悉位vector)。 这是给出的代码。 有人可以通过这个走过我吗? 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在做什么?

优先和位掩码操作

我遇到了一个(看似)很奇怪的例子。 取数字2( 0b10 ),并用1( 0b01 ) 这应该产生相当于0的0b00 。 不过,薛定谔先生来了: var_dump(0b10 & 0b01); // int(0) var_dump(0b10 & 0b01 == 0); // int(0) var_dump(0b10 & 0b01 != 0); // int(0) 威士忌酒。 探戈。 狐步舞。 诚然,对于按位运营商来说,我并不是最大的 – 所以也许我在某个地方出现了非常可怕的错误。 但是,在Python中: 0b10 & 0b01 == 0 = True 0b10 & 0b01 != 0 = False …所以?

我怎样才能在C中删除一个标志?

有一个variables,包含一些标志,我想删除其中的一个。 但我不知道如何删除它。 这是我如何设置标志。 my.emask |= ENABLE_SHOOT;