Tag: 位操作

有效地将无符号值除以2的幂,四舍五入

我想用2的任意幂实现无符号整数除法 ,有效地向上舍入 。 所以我想要的是数学上的ceiling(p/q) 0 。 在C中,不利用q的受限域的strawman实现可能类似于以下函数1 : /** q must be a power of 2, although this version works for any q */ uint64_t divide(uint64_t p, uint64_t q) { uint64_t res = p / q; return p % q == 0 ? res : res + 1; } …当然,我实际上并不想在机器级别使用除法或mod,因为即使在现代硬件上也需要很多周期。 我正在寻找使用轮class和/或其他一些廉价操作的力量减少 – 利用q是2的幂的事实。 你可以假设我们有一个有效的lg(unsigned int […]

解释用于设置,清除和测试单个位的算法

嘿,在Programming Pearls一书中,有一个源代码,用于在一个实际上是一组表示的整数数组中设置,清除和测试给定索引的一些内容。 代码如下: #include #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1+ N/BITSPERWORD]; void set(int i) { a[i>>SHIFT] |= (1<>SHIFT] &= ~(1<>SHIFT] & (1<<(i & MASK)); } 有人可以解释一下SHIFT和MASK定义的原因吗? 他们在代码中的目的是什么? 我已经阅读了之前的相关问题 。

如何从C中的数字中提取特定位?

我需要在C中提取short数据类型的特定部分(没有位)。 例如,我的二进制52504为11001101000 11000,我想要前6(FROM LSB – > MSB即011000十进制24)位和其余10位(11001101000十进制820)。 类似地,我希望这个函数过于通用,不能提取给定“start”和“end”的特定位数(即位块等效于一些十进制值)。 我检查了其他post,但那些没有帮助,因为给定的function并没有太多的概括。 我需要一些可以用于C的short数据类型的东西。 编辑 我有2048字节的短数组。 每个像素为10位。 所以我的16位组成每个字节占用一些时间2像素数据,有时3像素数据。 喜欢 (PIXEL:0,1)10 BITS + 6 BITS 然后(PIXEL:1,2,3)4 BITS(剩余第1个像素位)+ 10个BITS + 2个BITS。 等等..这个模式继续……所以,我想要提取每个像素并制作一个整个数组,让每个像素都被占用在整个字节(16位)上,如… 1字节应该包含1 DATA PIXEL,另一个BYTE应该包含整个16位的其他PIXEL值,依此类推。

为什么不能对C中的指针进行按位操作,有没有办法解决这个问题?

我读到你不能在指针上做bitmasks,为什么你不能对指针进行按位操作? 有没有办法达到同样的效果? 这同样适用于C ++吗?

仅使用C中的按位运算符检查数字x是否为正(x> 0)

isPositive – 如果x > 0则返回true ,否则返回false 示例: isPositive(-1) 法律操作: ! ~ & ^ | + << >> Max ops: 8 注意:不允许使用条件语句。 inline bool isPositive(int32_t x) { return ???; }

将m位设置为n位

我有一个32-bit数字而不使用for循环,我想将m位设置为 n位。 例如: m位可以是2nd或5th或9th或10th 。 n位可以是22nd位或11th 27位或11th位。 我假设(m <n)。 请帮帮我。谢谢

C中的位掩码

在C中构造位掩码的最佳方法是m设置位,前面是k设置位,后跟n设置位: 00..0 11..1 00..0 kmn 例如,k = 1,m = 4,n = 3将导致位掩码: 01111000

需要帮助理解K&R C第2章中的“getbits()”方法

在第2章,关于按位运算符的部分(第2.9节),我无法理解其中一个示例方法是如何工作的。 这是提供的方法: unsigned int getbits(unsigned int x, int p, int n) { return (x >> (p + 1 – n)) & ~(~0 << n); } 这个想法是,对于给定的数字x ,它将返回从位置p开始的n位,从右边开始计数(最右边的位是位置0)。 给定以下main()方法: int main(void) { int x = 0xF994, p = 4, n = 3; int z = getbits(x, p, n); printf(“getbits(%u (%x), %d, %d) = %u (%X)\n”, x, […]

位字段如何与字符类型一起使用?

struct stats { char top : 1; char bottom : 1; char side : 2; } MyStat; 我用整数看过这种格式但是上面的char位字段是如何工作的以及它代表什么? 谢谢。

将两个溢出的整数乘以第三个模数

给定三个整数, a , b和c , a,b <= c < INT_MAX我需要计算(a * b) % c但如果值太大则a * b会溢出,这会产生错误的结果。 有没有办法直接通过bithacks计算它,即不使用不会溢出的值的类型?