我正在寻找一个允许我打印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,我正在尝试用不熟悉的语言调试别人的图像处理程序.然而,如果它被标记为家庭作业,因为它是一个基本概念,然后公平竞争.
我有一个提供给内核的输入数组。每个线程都使用数组的一个值,并且根据规则要么更改该值,要么根本不更改它。
我想很快地找出输入内存中是否有任何变化,如果有的话,我想很快地找到这个变化发生的地方(输入数组的索引)。
我想到使用类似位数组的东西。位的总数将等于线程的总数。每个线程只能操作一位,因此最初这些位将设置为 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
先感谢您。
我试图遍历无符号字符的位,但我不知道从哪里开始,最终,我将对这些位执行其他按位操作,例如〜和xor..etc.
可能重复:
C打印位
可以说我有一个uint16_t数字:
uint16_t myVar = 0x3A44;
Run Code Online (Sandbox Code Playgroud)
我想打印来自myVar的0x3A44的二进制值,我怎么能迭代访问并打印每一位?
把它当作一个阵列?
考虑以下代码:
// 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,但在第二种情况下它是正确的?