相关疑难解决方法(0)

使用C在二进制表示中打印int

我正在寻找一个允许我打印int的二进制表示的函数.到目前为止我所拥有的是什么;

char *int2bin(int a)
{
 char *str,*tmp;
 int cnt = 31;
 str = (char *) malloc(33); /*32 + 1 , because its a 32 bit bin number*/
 tmp = str;
 while ( cnt > -1 ){
      str[cnt]= '0';
      cnt --;
 }
 cnt = 31;
 while (a > 0){
       if (a%2==1){
           str[cnt] = '1';
        }
      cnt--;
        a = a/2 ;
 }
 return tmp;

}
Run Code Online (Sandbox Code Playgroud)

但是当我打电话时

printf("a %s",int2bin(aMask)) // aMask = 0xFF000000
Run Code Online (Sandbox Code Playgroud)

我输出像;

0000000000000000000000000000000000xtpYy(还有一堆未知字符.

这是函数中的缺陷还是我打印字符数组的地址或什么?对不起,我只是看不出我出错的地方.

NB代码来自这里

编辑:这不是家庭作业FYI,我正在尝试用不熟悉的语言调试别人的图像处理程序.然而,如果它被标记为家庭作业,因为它是一个基本概念,然后公平竞争.

c binary integer

23
推荐指数
3
解决办法
9万
查看次数

在 CUDA 中模拟 std::bitset

我有一个提供给内核的输入数组。每个线程都使用数组的一个值,并且根据规则要么更改该值,要么根本不更改它。

我想很快地找出输入内存中是否有任何变化,如果有的话,我想很快地找到这个变化发生的地方(输入数组的索引)。

我想到使用类似位数组的东西。位的总数将等于线程的总数。每个线程只能操作一位,因此最初这些位将设置为 false,如果线程更改相应的输入值,则该位将变为 true。

为了使它更清楚,我们假设我们有这个输入数组称为A

1 9 3 9 4 5
Run Code Online (Sandbox Code Playgroud)

位数组如下

0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

因此我们将有 6 个线程处理输入数组。假设最终的输入数组是

1 9 3 9 2 5
Run Code Online (Sandbox Code Playgroud)

所以最终的位数组将是:

0 0 0 0 1 0
Run Code Online (Sandbox Code Playgroud)

我不想使用数组,bool因为每个值都会占用 1 个字节的内存,这相当多,因为我只想使用位来工作。

有可能实现这样的目标吗?

我想创建一个char数组,其中数组的每个值都有 8 位。但是,如果两个线程想要更​​改数组第一个字符的不同位怎么办?即使位内的更改将位于不同的位置,他们也必须以原子方式执行操作。因此,使用原子操作可能会破坏并行性,在这种情况下,不需要使用原子操作,它没有任何意义,但必须使用,因为使用字符数组而不是更专门的东西的限制像一个std::bitset

先感谢您。

cuda gpu bit bitset

5
推荐指数
1
解决办法
2765
查看次数

循环通过位C

我试图遍历无符号字符的位,但我不知道从哪里开始,最终,我将对这些位执行其他按位操作,例如〜和xor..etc.

c bit-manipulation bit

2
推荐指数
2
解决办法
8500
查看次数

C:访问uint16_t数字中的各个位?

可能重复:
C打印位

可以说我有一个uint16_t数字:

uint16_t myVar = 0x3A44;
Run Code Online (Sandbox Code Playgroud)

我想打印来自myVar的0x3A44的二进制值,我怎么能迭代访问并打印每一位?

把它当作一个阵列?

c bit

0
推荐指数
1
解决办法
5106
查看次数

为什么1ul << 64返回1而不是0?

考虑以下代码:

// Simply loop over until 64 is hit. 
unsigned long x = 0;
for (int i = 0; i <= 64; i++) {
  if (i == 64) {
    x = 1ul << i;
    printf("x: %d\n", x);
  }
}
Run Code Online (Sandbox Code Playgroud)

我们知道无符号长是64位宽,左移1到64位将变为1000 ... 000(后面有64个零),并且会被截断为0.但是,实际的打印输出给出:

x: 1
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我们这样做的话

printf("x: %d\n", (1ul << 64));
Run Code Online (Sandbox Code Playgroud)

它会打印0.

任何人都可以解释为什么会这样吗?为什么在第一种情况下,程序错误地产生1而不是0,但在第二种情况下它是正确的?

c math unsigned gcc long-integer

-2
推荐指数
1
解决办法
1719
查看次数

标签 统计

c ×4

bit ×3

binary ×1

bit-manipulation ×1

bitset ×1

cuda ×1

gcc ×1

gpu ×1

integer ×1

long-integer ×1

math ×1

unsigned ×1