Tag: 位操作

用于生成下一位以在灰色代码中翻转的C代码

我需要一个函数返回一个数字,基本上告诉我在移动到格雷码的第n个元素时哪个位是要翻转的。 如果它是标准(reflection)格雷码或其他一些最小位切换方法并不重要。 我可以做到,但似乎不必要的笨拙。 目前我有这个: #include int main() { int i; for (i=1; i>1); n2 = n^(n>>1); d = n1^n2; j = 0; while (d >>= 1) j++; return j; } main()中的循环仅用于演示函数的输出。 有没有更好的办法? 编辑:只看输出,显然可以更简单地做到这一点。 我添加了第二个函数gray2,它可以更简单地完成相同的操作。 这会是这样做的吗? 这不是生产代码,而是业余爱好者。 #include int main() { int i; for (i=1; i>1); n2 = n^(n>>1); d = n1^n2; j = 0; while […]

如何重置字符串中的位值?

在最近的采访中我得到了一个这样的问题: Given a string value, find out its 127th bit and reset it, do this in C language Reset means if that particular bit is 0 change to 1 and vice versa 我没有找到任何算法,但我想知道如何用C语言解决这个问题。 编辑: 从少数人得到答案后,我尝试了这个: #include void main() { char *str=”anto”; str[15] ^= 0x80; printf(“%s”,str); } 我得到的输出为: anto 。 现在我的头脑中有一点点改变一点不会改变输出?

检查一个字节中的ON位数?

我知道我们可以通过使用逻辑OR设置字节中的任何位,并且可以通过逻辑AND清除任何位 val |= (1<<order_number_of_bit_to_set); //for setting some specific number of bit 并清理一下 val &= ~(1<<order_number_of_bit_to_clear); // specific bit to clear 但我的问题是我们如何检查在字节中设置了多少和哪些有序数字位。 例如,如果我们有 val = 0x22; 这意味着在字节中设置第2和第5位 什么是高效,快速和最短的方式来做到这一点? 想到的快速解决方案是迭代所有位并检查它们的顺序以及是否设置记录并显示位的顺序。 但有没有其他有效的方法来做到这一点?

将N位移位整个字符arrays

假设我有一个字符数组,我希望每个字节向左移N位,向左移,所以只有第一个字符的N位才会丢失。 示例: kxmo 3位的kxmo为X@hx 这就是我目前所拥有的,但它没有按预期工作: #include int main(void) { //shift the array with length *len* *shift* bits to the left int len = 4, shift = 3; unsigned char a[len] = “kxmo”; unsigned char b[len]; //X@hx unsigned char tmp = 0, tmp2 = 0; for(int i = len – 1; i > 0; i–) { […]

二进制到无符号int,使用C中的按位运算和指针运算

我只能使用按位运算和指针运算来解决这个问题。 我正在从二进制转换为unsigned int。 我写的function是: unsigned int atob(const char* nptr); atob(“101”)应返回5,atob(“11000”)应返回24,atob(“11 $”)应返回3,atop(“”)应返回0。 我对按位操作很新,所以我真的需要一些专门的帮助。 编辑: nptr只能递增,而不允许其他inc / dec。

将float转换为int(大整数)的函数

这是一个大学问题。 只是为了确保:-)我们需要实现(浮动)x 我有以下代码必须将整数x转换为存储在无符号整数中的浮点二进制表示。 unsigned float_i2f(int x) { if (!x) return x; /* get sign of x */ int sign = (x>>31) & 0x1; /* absolute value of x */ int a = sign ? ~x + 1 : x; /* calculate exponent */ int e = 0; int t = a; while(t != 1) { […]

将C校验和函数转换为Lua

我正在编写一个脚本,允许我的主机设备将数据文件发送到从设备。 从站需要进行校验和计算,并在发送文件之前添加到我的请求的末尾。 我的问题是,我不仅对编程很新,而且还在努力完全掌握位操作。 我目前在一个Java类中,所以校验和function所以部分函数确实有一个熟悉的格式,但由于我仍然在用比特和位库弄乱我的头,我在将提供的校验和函数转换为Lua中。 在C中提供函数之前,首先将该函数描述如下: Initialise the checksum as FFFF(hex). For each byte Checksum = Checksum XOR (current Byte) For I = 0 to 7 If ((Checksum AND 1)=0) Checksum = Right_Bit_Shift Checksum 1 bit Else Checksum = (Right_Bit_Shift Checksum 1 bit) XOR A001(hex) Next I Next Byte 以下是用C编写的示例: /* *Routine CRC takes a data […]

在指数和小数部分之间转换具有不同位数的格式

我试图刷新浮点数。 我正在阅读一个练习,要求从格式A转换为:k = 3,4比特分数和偏差= 3到格式B,其中k = 4,3比特分数和偏差7。 我们应该在必要时进行圆 格式之间的示例: 011 0000 (Value = 1) =====> 0111 000 (Value = 1) 010 1001 (Value = 25/32) =====> 0110 100 (Value = 3/4 Rounded down) 110 1111 (Value = 31/2) =====> 1011 000 (Value = 16 Rounded up) 问题:我无法弄清楚转换的工作原理。 首先,我设法在某些情况下正确地做到了,但我的方法是将格式A的位模式转换为十进制值,然后以格式B的位模式表示该值。 但有没有办法以某种方式从一位模式转到另一种模式而不进行此转换,只知道我们将e扩展1位并将分数减少1?

C编程语言中的Bitfields

如何访问C.Means中的整个结构成员我想在结构中获取变量的所有数据。 struct data { char a:1; char b:2; char c:3; char d:1; } arr; 我可以通过使用访问个人成员。 operator.But我需要访问该结构中的所有成员。请告诉我该怎么办。

如果你将一个大的int转换为float会发生什么

这是一个普遍的问题,当我使用gcc 4.4将一个非常大/小的SIGNED整数转换为浮点数时会发生什么。 我在做铸造时看到了一些奇怪的行为。 这里有些例子: MUSTBE是用这种方法获得的: float f = (float)x; unsigned int r; memcpy(&r, &f, sizeof(unsigned int)); ./btest -f float_i2f -1 0x80800001 input: 10000000100000000000000000000001 absolute value: 01111111011111111111111111111111 exponent: 10011101 mantissa: 00000000011111101111111111111111 (right shifted absolute value) EXPECT: 11001110111111101111111111111111 (sign|exponent|mantissa) MUST BE: 11001110111111110000000000000000 (sign ok, exponent ok, mantissa???) ./btest -f float_i2f -1 0x3f7fffe0 EXPECT: 01001110011111011111111111111111 MUST BE: 01001110011111100000000000000000 […]