为啥memset不能将数组元素初始化为1
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥memset不能将数组元素初始化为1相关的知识,希望对你有一定的参考价值。
当然不行啦。
memset只有赋值是-1,0是正确的,原因如下:
用memset初始化数组为1出错-CSDN
memset是按字节赋值的,取变量a的后8位二进制进行赋值。
1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。
之所以输入0,-1时正确,纯属巧合。
0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1
其他的数字的赋值只能用for:
for(int i=1;i<=n;i++)
z[i]=1;
参考技术A 很简单memset是一个字节一个字节的设置,把一个int的每个字节都设置为1,也就是0x01010101,十进制就是16843009 参考技术B 1、效果是一样的,memset更常用。memset的效率比for循环要高出很多。
2、使用memset函数与将函数代码写在自己的程序里是不一样的,C标准库中的memset对Cache的利用做了优化,具体的在《C专家编程》151页有解释,这里给出测试:
#include <string.h>
#define MAXSIZE 100000
int main()
char arr[MAXSIZE];
for(int i=0;i<10000;i++)
memset(arr,'0',sizeof(arr));
// for(int j=0;j<MAXSIZE;j++)
// arr[0] = '0';
return 0;
程序里的注释部分与memset行分别使用,结果是使用memset的程序运行时间大约为0.1s,而用for循环的程序要3s多。综上:memset()可以用在字符数组的初始化以及类似于memset(arr,0,n*sizeof(int));的情况,效率比手动赋值要高的多。
如何将二维数组的所有元素初始化为java中的任何特定值
【中文标题】如何将二维数组的所有元素初始化为java中的任何特定值【英文标题】:How to initialize all the elements of a 2D array to any specific value in java 【发布时间】:2018-09-28 13:04:21 【问题描述】:在 C++ 中有一个函数 ( memset() ) 可以初始化一维数组和任何多维数组的值。但是在java中有一个函数fill可以初始化一维数组但不能初始化多维数组。
【问题讨论】:
您能详细说明一下吗?你想在java中做什么,你是怎么做的,为什么它不起作用? 你试过用两个循环吗? 我还没有使用循环 如果 x 是一个二维整数数组 then.to 用 3 填充 x 中的所有值使用Arrays.stream(x).forEach(a->Arrays.fill(a,03););
【参考方案1】:
Arrays.fill()
方法可用于填充一维数组,但没有内置方法可以“深度”填充多维数组。
对于二维数组,我会这样做:
int[][] arr2 = new int[5][5];
for(int[] arr1 : arr2)
Arrays.fill(arr1, 1);
【讨论】:
痛苦。太糟糕了,这在 java8/9 时间范围内没有得到改进以上是关于为啥memset不能将数组元素初始化为1的主要内容,如果未能解决你的问题,请参考以下文章