Tag: 位操作

在没有条件的情况下,使用另一个无符号字符的另一位设置一个unsigned char

我使用bitwise以这种方式打开和关闭位: unsigned char myChar = …some value myChar |= 0x01 << N // turn on the N-th bit myChar &= ~(0x01 << N) //turn off the N-th bit 现在,假设N的值已知,但set / unset操作依赖于另一个unsigned char的值。 从现在开始,我这样做: if ((otherChar & (0x01 << M)) != 0) { //M-th bit of otherChar is 1 myChar |= 0x01 << N; }else { […]

如何处理超过64位的位域?

问题说明了一切。 如果我有一个96位字段: uint32_t flags[3]; //(thanks @jalf!) 鉴于我的子域可能位于32位边界(例如,从第29位到第35位的字段),我如何最好地访问它? 我需要尽可能快地访问,所以我宁愿不将它们作为数组的32位元素进行迭代。

C:设置变量范围内所有位的最有效方法

我们以int为例: int SetBitWithinRange(const unsigned from, const unsigned to) { //To be implemented } SetBitWithinRange应该返回一个int ,其中当from smaller to且两者都在0到32的范围内时,所有且仅仅从bit到bit的位开始被设置。 例如: int i = SetBitWithinRange(2,4)将导致i的值为0b00 … 01100

计算设置的k位大于另一个整数x的最小整数?

我想计算设置恰好为k位的最小整数,即大于另一个整数x 。 例如,如果x = 1001010那么对于k=2 ,对于k=4 ,答案应该是1010000 ,答案应该是1001011 ,对于k=5 ,答案是1001111 我认为需要设置至少与整数x设置的最左位一样多的位,然后在x设置与下一个最左边设置位相邻的MSB侧位或者设置下一个最左边的设置位之间进行选择然后通过重复相同的过程来查看设置后面的位; 一直计算k中剩下的位数。 我不确定这是否是正确的方法。

找到char变量中唯一’1’位的索引的最有效方法(在C中)

这是一个面试问题: 给你一个名为ch的char变量,当你知道它代表一个二进制forms的数字时,它的八位中只有一个将等于’1’。 IE, ch的唯一可能值是: 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 。 给定变量ch ,我需要编写最有效的代码来获得该’1’位的索引。 例如:如果ch == 0x1 – >结果为0.如果ch == 0x4 – >结果为2。 显而易见的方法是使用switch-case,但我需要更高效的东西。 为了有效实施,您可以在这里进行任何操作吗?

‘memcpy’式函数支持各个位的偏移量?

我正在考虑解决这个问题,但它看起来是一项相当艰巨的任务。 如果我自己拿这个,我可能会用几种不同的方式写出并选择最好的,所以我想我会问这个问题,看看是否有一个好的图书馆已经解决了这个问题,或者是否有人有想法/建议。 void OffsetMemCpy(u8* pDest, u8* pSrc, u8 srcBitOffset, size size) { // Or something along these lines. srcBitOffset is 0-7, so the pSrc buffer // needs to be up to one byte longer than it would need to be in memcpy. // Maybe explicitly providing the end of the buffer is best. // Also […]

C中的按位移位

我得到了一些令我困惑的C代码: int a = 1; int b = 32; printf(“%d\n %d\n”, a<<b, 1<<32); 输出是 1 0 代码在Ubuntu 16.04(Xenial Xerus)上运行,我使用GCC版本5.4.0的gcc -m32 ac编译它。 我读过一些post已经解释了为什么a<<b输出1,但我不明白为什么1<<32结果为0.我的意思是, a<<b和1<<32之间a<<b什么区别?

按位AND和签名字符

我有一个文件,我已经读入数据类型signed char数组。 我不能改变这个事实。 我现在想这样做: !((c[i] & 0xc0) & 0x80)其中c[i]是签名字符之一。 现在,我从C99标准的 6.5.10节知道“每个操作数[按位AND]应该具有整数类型。” C99规范的第6.5节告诉我: 一些运算符(一元运算符〜,以及二元运算符<>,&,^和|,统称为按位运算符)应具有具有整数类型的操作数。 这些运算符返回依赖于整数内部表示的值,因此具有已签名类型的实现定义方面 。 我的问题是双重的: 由于我想使用文件中的原始位模式,如何将已signed char转换/转换为unsigned char ,以使位模式保持不变? 是否存在这些“实现定义方面”的列表(例如MVSC和GCC)? 或者您可以采用不同的路径并认为这对于任何c[i]值的有符号和无符号字符产生相同的结果。 当然,我会奖励对相关标准或权威文本的引用,并阻止“知情”的推测。

将一个字节移位超过8位

在这里从字节缓冲区转换回unsigned long int时: unsigned long int anotherLongInt; anotherLongInt = ( (byteArray[0] << 24) + (byteArray[1] << 16) + (byteArray[2] << 8) + (byteArray[3] ) ); 其中byteArray声明为unsigned char byteArray[4]; 题: 我以为byteArray[1]只是一个无符号字符(8位)。 当左移16时,不会将所有有意义的位移出并用0填充整个字节吗? 显然它不是8位。 也许它正在移动整个byteArray,这是一个连续的4字节? 但我不知道它是如何工作的。

C(HW)中的逐位饱和加法

我正在完成一项任务,我无法弄清楚如何实现这一点。 我必须创建一个函数sadd(int x,int y),它返回加在一起的数字,除非它溢出(然后只返回max possible int)。 我已经能够提出一些涉及强制转换和条件语句的解决方案,但解决方案中不允许这些解决方案。 只有经营者〜! ^ + <>&和|。