Tag: 位操作

Int到二进制转换的解释

我的问题基于这篇文章: 十进制到二进制 ,它是选择的解决方案。 我可以让选择的答案代码工作,但它只适用于5位。 如何修改此代码以适用于更大的数字,比如8位? 我尝试将第一行中的字符偏移从5调整为8,但没有成功。 void getBin(int num, char *str) { *(str+5) = ‘\0’; int mask = 0x10 <>= 1) *str++ = !!(mask & num) + ‘0’; } 并使用给定的代码进行测试,再次调整6到9以匹配上面的函数: int main() { char str[6]; getBin(10, str); printf(“%s\n”, str); return 0; } 但输出仍然只显示前五位然后给出随机符号。 当我调整这些数字时,有人可以解释一下究竟发生了什么,这样我就可以将其用于8(或任何其他大小)位转换吗?

改变一个整数

我们有一个整数 int x = 50; 在二进制中,它是 00110010 如何以编程方式更改第四(第4)位?

常数的按位OR

在阅读这里的一些文档时,我发现了这个: unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 我不知道这是如何工作的。 我读了C中的按位运算符,但我不明白你如何在一个int中包含三个(或更多!)常量,以后能够以某种方式从int中提取它们? 进一步深入了解文档,我也发现了这个,这可能是相关的: typedef enum { kCFCalendarUnitEra = (1 << 1), kCFCalendarUnitYear = (1 << 2), kCFCalendarUnitMonth = (1 << 3), kCFCalendarUnitDay = (1 << 4), kCFCalendarUnitHour = (1 << 5), kCFCalendarUnitMinute = (1 << 6), kCFCalendarUnitSecond = (1 << 7), kCFCalendarUnitWeek = (1 << 8), […]

C中的多字加法

我有一个使用GCC的__uint128_t的C程序很棒,但现在我的需求已经超越了它。 我有196或256位快速算术的选择吗? 我需要的唯一操作是加法(我不需要进位,即,我将使用mod 2 ^ 192或2 ^ 256)。 速度很重要,所以如果可能的话,我不想转向一般的多精度。 (实际上我的代码确实在某些地方使用了多精度,但这是在关键循环中并且将运行数百亿次。到目前为止,多精度需要运行数万次。) 也许这很简单,可以直接编码,或者我需要找到一些合适的库。 你的建议是什么,哦Stack Overflow? 澄清:GMP对我的需求来说太慢了。 虽然我实际上在我的代码中使用了多精度,但它不在内循环中并且运行时间少于10 ^ 5次。 热循环运行更像10 ^ 12次。 当我改变我的代码(增加一个尺寸参数)以使多精度部分比单精度运行更频繁时,我的速度减慢了100倍(主要是由于内存管理问题,我认为,而不是额外的μops)。 我希望将其降低到4倍或更好。

用于设置和清除位的宏

我试着写一些简单的宏来简化设置和清除位的任务,这应该是一个简单的任务,但我似乎无法使它们正常工作。 #define SET_BIT(p,n) ((p) |= (1 << (n))) #define CLR_BIT(p,n) ((p) &= (~(1) << (n)))

128位数字的按位移位操作

假设我有一个由4个32位整数组成的数组,用于存储128位数 如何在这个128位数字上执行左右移位? 谢谢!

转换4×4字节矩阵的最快方法

我有一个4×4字节块,我想使用通用硬件进行转置。 换句话说,对于字节AP,我正在寻找最有效的(就指令数量而言)的方式 ABCD EFGH IJKL MNOP 至 AEIM BFJN CGKO DHLP 我们可以假设我在内存中有指向A , E , I和M有效指针(这样从A读取32位将得到包含字节ABCD的整数)。 由于对大小和数据类型的限制,这不是此问题的重复。 我的矩阵的每一行都可以容纳32位整数,我正在寻找能够使用通用硬件快速执行转置的答案,类似于SSE宏_MM_TRANSPOSE4_PS 。

在没有算术运算符的情况下执行位除

我正在尝试完成一项任务,要求我为二进制算术编写三个函数。 badd()是为我提供的,所以我用它来帮助编写bsub()和bmult()函数。 但是,我无法理解如何执行bdiv()函数。 我知道我需要使用右移和我的bsubb()函数迭代这些位,但我不知道如何实现它。 以下是我到目前为止所写的function。 如果您发现我在写它们时犯了任何错误(请注意bsub()和bmult()),请告诉我。 谢谢。 /** This function adds the two arguments using bitwise operators. Your * implementation should not use arithmetic operators except for loop * control. Integers are 32 bits long. This function prints a message * saying “Overflow occurred\n” if a two’s complement overflow occurs * during the addition process. […]

从指针窃取位

在多处理器编程的艺术中,p215,作者说在C中,你可以从指针“窃取”一点,并使用逐位运算符从单个字中提取一些标志(标记)和指针。 我不知道这是怎么做的,所以一个例子可以帮助我。

计数位数

重复: 计算32位整数中设置位数的最佳算法? 假设你有一个号码。 有没有办法在这个数字的二进制表示中计算等于1的位,而不是使用迭代? 我的意思是,有没有办法使用一些按位运算符和掩码在恒定时间内完成它。 我需要的解决方案适用于32位和64位架构。 啊差点忘了,我需要它用于C语言或汇编程序也很好。