Tag: 位操作

如何将位从一个变量复制到另一个变量?

假设我有这个int变量v1 : 1100 1010 而这个变量int v2 : 1001 1110 我需要将v2的最后四位复制到v1的最后四位,以便结果为: 1100 1110 ^ ^ last four bits of v2 | | first four bits of v1 我如何在C或C ++中做到这一点? 我阅读了一些关于按位操作的文章,但我找不到任何具体的信息。

如何编写一个常量时间函数来将最高有效位复制到所有位

我想在C中编写一个函数,它接受uint8_t的MSB,如果设置了,则返回0xFF ,如果不是0x00 。 简而言之,它返回一个整数,其中所有位都设置为与MSB相同的值。 但我想以完全恒定的时间方式完成它,没有分支,没有数组偏移,只是数学运算,保证总是触摸相同的位数。 理想情况下,没有任何未定义的行为。 如何才能做到这一点?

以无符号32位整数查找位位置

当我们谈到比特位置时,我想我可能已经在我的CS课上睡着了,所以我希望有人能伸出援助之手。 我有一个无符号的32位整数(让我们使用值:28) 根据我要讨论的一些文档,整数的值包含指定各种内容的标志。 标志内的位位置从1(低位)到32(高位)编号。 所有未定义的标志位都是保留的,必须设置为0。 我有一个表格,显示标志的含义,数字1-10的含义。 我希望有人可以尝试向我解释这一切意味着什么,以及如何从数字28中找到“标志”值,基于位位置。 谢谢

为什么abs(0x80000000)== 0x80000000?

我刚刚开始阅读Hacker’s Delight ,它将abs(-2 31 )定义为-2 31 。 这是为什么? 我在几个不同的系统上尝试了printf(“%x”, abs(0x80000000)) ,并且我在所有系统上都返回了0x80000000。

比掩码位和手工提取数据更有效(计算)位字段?

我有许多小块数据,我希望能够推入一个更大的数据类型。 假设,假设这是一个日期和时间。 显而易见的方法是通过像这样的位字段。 struct dt { unsigned long minute :6; unsigned long hour :5; unsigned long day :5; unsigned long month :4; unsigned long year :12; }stamp; 现在让我们假装这个东西是有序的,这样首先声明的东西比后面声明的东西具有更高的重要性,所以如果我用变量的第一个字母表示位,它看起来像: mmmmmm|hhhhh|ddddd|mmmm|yyyyyyyyyyyy 最后,让我假装我只是声明一个unsigned long并使用mask将其拆分并进行相同的操作。 unsigned long dateTime; 这是我的问题: 在计算机需要做什么方面,以下是访问分钟,小时等等的方法吗? 或者是否存在编译器/计算机与位字段一起使用的一些棘手方法。 unsigned minutes = stamp.minutes; //versus unsigned minutes = ((dateTime & 0xf8000000)>>26; 和 unsigned hours = stamp.hours; //versus unsigned […]

C – 从一个字节中获取一点

可能重复: 如何从c中的整数值中逐位获取数据? 我有一个8位字节,我想从这个字节得到一点,比如getByte(0b01001100,3)= 1

是否可以使用按位运算符和受限运算符重写模数(2 ^ n – 1)

对于unsigned int x,是否可以仅使用以下运算符(加上没有循环,分支或函数调用)来计算x%255(或者通常为2 ^ n – 1)? ! , ~ , & , ^ , | , + , << , >> 。

生成反向位查找表(8位)背后的算法

我在这里找到了查找表。 该表生成为8位的反向位表。 我无法弄清楚它为何起作用。 请解释它背后的理论。 谢谢 static const unsigned char BitReverseTable256[256] = { # define R2(n) n, n + 2*64, n + 1*64, n + 3*64 # define R4(n) R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16) # define R6(n) R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 ) R6(0), […]

用位运算符替换“==”

仅使用按位运算符(|,&,〜,^,>>,<<)和其他基本运算符(如+, – 和!),是否可以替换下面的“==”? int equal(int x, int y) { return x == y; }

使用按位运算符的条件语句

所以我看到这个问题已经被提出,但答案有点模糊,无益。 好的,我只需要使用“&^〜!+ | >> <<”来实现ac表达式 表达式需要类似:a? b:c 所以,从我能够讲述的,表达式需要看起来像: return (a & b) | (~a & c) 当a = 0时,这是有效的,因为用b进行和将得到零,然后或表达式将返回右侧, (~a & c) ,因为~0给出所有1,并且使用所有1返回c返回c 。 但是,当a> 0时,这不起作用。有人可以尝试解释为什么会这样,或者如何解决它?