2017-03-01 61 views
0

我有十进制数字矩阵,我知道我可以将它们转换使用此代码二进制文件:(IEEE 754双精度二进制)生成随机数字在特定的二进制范围

m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]); 
b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b)); 

使用此代码,我认为最后8位是最重要的位。 我想生成随机十进制数并将这些元素替换为8,最后一个位在替换为生成的随机数后不会改变。我需要有一个新的号码,同时保留最后8位。

例如:

b=-1.12; 
m=1110110001010001101110000001111010000101111010111111000110111111; 

改为:

m=0000110000000000001110000000011010000001100010000010000110111111; 

等于:

b=-1.337678432804527e-04 

我知道我可以在两个号码,但之间产生随机小数我不知道如何解决上述问题。

mymatrix(1:q,:)= value2 + (value2-value1).*rand(q,size(y_blk,2)); 
+0

你究竟想在这里实现什么?将数字从十进制转换为二进制数,更改前56位,然后将其转换回十进制?似乎有一个快捷方式,取决于您期望的最终结果... – Wolfie

+0

生成0到255(8位)之间的整数并将其转换为二进制。 – mpaskov

+0

@mpaskov不是那么简单... 8最后一位不等于0-255 – Hanna

回答

1

保持第一56将最后8

生成0255之间的整数,并将其转换为二进制。用它们替换你序列的前8位。

b=-1.12; 
m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]); 
m_small = [dec2bin(randi(256)-1,8), m(9:end)] 
m_large = [m(1:end-8),dec2bin(randi(256)-1,8)] 
b_small = reshape(typecast(uint8(bin2dec(reshape(m_small,8,[]).')),'double'),size(b)); 
b_large = reshape(typecast(uint8(bin2dec(reshape(m_large,8,[]).')),'double'),size(b)); 

b_small的值很难改变,表明前8位是最不重要的。 b_large变化很大,所以最后8个是最重要的位。


保持过去的8,将前56

误会你希望保留最后8位和更换其他的问题。在这种情况下,生成56位随机数据​​并添加您保存的最后8个数据。现在,事实证明,Matlab只能生成2^53的最大整数。代替产生一个高达2^56的整数,产生7个每个都是2^8,并连接它们。

m_new = [reshape(dec2bin(randi(2^8,[7,1])-1,8),[1,56]), m(end-7:end)] 
b_new = reshape(typecast(uint8(bin2dec(reshape(m_new,8,[]).')),'double'),size(b)); 
+0

我可以保留位57和58吗? – Hanna

+1

是的,你可以保存'm(end-7:end-5)'并在末尾添加'dec2bin(randi(2^6)-1,6)'。 – mpaskov

相关问题