Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
有没有办法使位旋转操作可逆?我的意思是,如果有图像X(大小256 * 256 * 3),则在进行位旋转时会获得图像Y。然后,对Y进行一点旋转,我们得到图像X。此外,如何解决位溢出问题,从而不会造成信息丢失。
回答: 更新:我已经采用了下面发布的代码,并将其完善为具有错误检查,帮助文档的完整功能 ,并且能够对无符号整数和双精度变量的数组进行操作,就像相关的内置函数BITSHIFT一样 。我建议使用上面链接到的新版本,而不要使用下面发布的旧版本。 MATLAB没有内置的位旋转功能,而BITSHIFT函数将丢弃溢出的位。但是,您可以根据现有的位操作实现自己的位旋转功能。这是我放在一起的一个简单的首过版本(没有错误检查): function data = bit_rotate(data,nBits) dataBits = log2(double(intmax(class(data)))+1); %# Number of bits in data nBits = rem(nBits,dataBits); %# No need to rotate by dataBits bits or more if nBits == 0 %# No bit rotation needed, just return return end shiftedData = bitshift(data,nBits); %# Bit shift the data lostData = bitxor(data,bitshift(shiftedData,-nBits)); %# Find the lost bits rotatedData = bitshift(lostData,nBits-sign(nBits)*dataBits); %# Rotate them data = shiftedData+rotatedData; %# Add the rotated bits to the shifted bits end 这是一些测试数据: >> B = uint8(208); %# An unsigned 8-bit integer value >> disp(dec2bin(B,8)) %# Display the bit pattern of B 11010000 >> disp(dec2bin(bit_rotate(B,2),8)) %# Rotate left by 2 bits 01000011 >> disp(dec2bin(bit_rotate(B,-2),8)) %# Rotate right by 2 bits 00110100 请注意, bit_rotate还将对data任何大小矩阵输入进行操作,只要它是无符号整数类型即可。 更多&回答... |
![]() |
![]() |