如果有一个新的位1到一个字节(ex.0xaa) 10101010 ==> 11010101
如果有一个新位0 t0一个字节(ex.0xaa) 10101010 ==> 01010101
有任何建议吗?
答案 0 :(得分:1)
如果有一点
0x80 | (0xaa>>1)
如果没有位
0x7F & (0xaa>>1)
答案 1 :(得分:1)
这是一个奇怪的请求,但它可以做到。这段代码有两个参数:第一个是整数形式的原始字节,第二个是你想要的位在位移后以0或1的形式添加到左边。使用整数很容易向右移动;只是除以2,其余的就会掉线。让我们将2乘以7的幂并将其存储在@FlagNumber变量中以用于我们的计算。
如果我们想将左侧的位设置为零,我们需要先检查该值。八位的位应该已经为零,但是让我们检查以防有人传递大于255的值让我们检查。如果由于某种原因将其设置为1,我们将使用简单的^(xor)来关闭它。
如果我们想将左侧的位设置为1,我们将使用简单的| (或)上交)
我将把它全部包装在一个函数中,这就是你得到的。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Jacob Raines
-- Create date: 2013-04-03
-- Description: Shift byte to the right and set 8th bit
-- =============================================
CREATE FUNCTION dbo.Flag_ByteAppendLeft
(
@InputByte int, --10101010
@InputBit int --0 or 1
)
RETURNS int
AS
BEGIN
/* Examples & Notes
SELECT dbo.Flag_ByteAppendLeft(170, 1) --(10101010, 1) Should Return 11010101 (213)
SELECT dbo.Flag_ByteAppendLeft(170, 0) --(10101010, 0) Should Return 01010101 ( 85)
*/
DECLARE @OutputByte int
DECLARE @FlagPower as int
DECLARE @FlagNumber as int
SET @OutputByte = @InputByte / 2 --Bit Shift once to the right
SET @FlagNumber = 7 --Flag 7 (starting at 0) is the 8th bit.
SET @FlagPower = POWER(2, @FlagNumber)
IF (@InputBit = 0)
BEGIN
IF (@OutputByte & @FlagPower = @FlagPower) -- If set
BEGIN
SET @OutputByte = @OutputByte ^ @FlagPower -- Then Toggle Flag with xor
END
END
ELSE
BEGIN
SET @OutputByte = @OutputByte | @FlagPower -- Set Flag
END
RETURN @OutputByte
END
GO
答案 2 :(得分:0)
在C中,如果是unsigned int
,则可以执行以下操作。
在左侧添加logic 1
位。
x = 0x80000000 | (x >> 1);
在左侧添加logic 0
位。
x = x >> 1;
注意到在C中,>>
由于unsigned int
而属于logical shift,因此在向右移动时会向左侧放置logic 0
位。
另请注意,0x8000000
只会因unsigned int
中的额外位而有效。